2.4 date_time库概述
日期和时间在程序中就像整数和字符串一样,经常出现。日期和时间作为一种基础设施广泛地用在很多地方,如作为随机数的种子值。但精确地操纵时间非常困难,因为时间本身是一个难以度量的实体,它有许多变化。
我们使用的基本时间度量的依据是地球的自转,但地球的自转是不均匀的(有时非常剧烈的地质运动会影响地球的自转),因此需要用闰秒、闰月和闰年对时间进行调整,不同的地区还有夏令时、时区等人为规定。在现实生活中存在着很多个时间度量体系,如儒勒历、格里高利历、农历、印加帝国的太阳历、UTC等,非常复杂。想要实现一个可以计算各种时间日期的相关问题的库难度相当大。
date_time库勇敢地面对了这个挑战,并成功地解决了大部分问题。它是一个非常全面且灵活的日期时间库,基于我们日常使用的公历(格里高利历),可以提供与时间相关的各种所需功能,如精确定义时间点、时间段和时间长度、加减若干天/月/年、日期迭代器等。date_time库还支持无限时间和无效时间这种在实际生活中有用的概念,而且它可以与C语言的传统时间结构tm相互转换,提供向下支持。
2.4.1 使用方式
date_time库需要编译才能使用,在jamfile里指定lib的语句如下:
lib boost_date_time;
date_time库包含两个部分,分别是处理日期的gregorian和处理时间的posix_time,它们各自需要包含的头文件如下:
2.4.2 基本概念
处理时间很复杂,所以在使用date_time库之前,我们需要明确一些基本概念。
如果把时间想象成一个向前和向后都无限延伸的实数轴,那么时间点就是数轴上的一个点;时间段就是两个时间点之间一个确定的区间;时长(时间长度)则是一个有正负号的标量,是两个时间点之差,不属于数轴。
时间点、时间段和时长三者之间可以进行运算,如“时间点+时长=时间点”“时长+时长=时长”“时间段∩时间段=时间段”“时间点∈时间段”等,但有些运算是无意义的,如“时间点+时间点”“时长+时间段”等。基于生活常识,很容易理解这些计算,但在编写时间处理程序时必须注意。
date_time库支持无限时间和无效时间(Not Available Date Time,NADT)这样特殊的时间概念,类似于数学中极限的含义。时间点和时长都有无限的值,它们的运算规则比较特别,如“+∞时间点+时长=+∞时间点”“时间点+∞时长=+∞时间点”。如果将正无限值与负无限值进行运算将有可能得到无效时间,如“+∞时长-∞时长=NADT”。
date_time库中用枚举special_values定义了这些特殊的时间概念,它位于名字空间boost::date_time,并被using语句引入其他子名字空间。
■ pos_infin:表示正无限。
■ neg_infin:表示负无限。
■ not_a_date_time:无效时间。
■ min_date_time:可表示的最小日期或时间。
■ max_date_time:可表示的最大日期或时间。