Boost程序库完全开发指南:深入C++”准”标准库(第5版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 date_time库概述

日期和时间在程序中就像整数和字符串一样,经常出现。日期和时间作为一种基础设施广泛地用在很多地方,如作为随机数的种子值。但精确地操纵时间非常困难,因为时间本身是一个难以度量的实体,它有许多变化。

我们使用的基本时间度量的依据是地球的自转,但地球的自转是不均匀的(有时非常剧烈的地质运动会影响地球的自转),因此需要用闰秒、闰月和闰年对时间进行调整顺便一提,2012年6月30日的闰秒给不少Linux服务器和网站带来了麻烦。,不同的地区还有夏令时、时区等人为规定。在现实生活中存在着很多个时间度量体系,如儒勒历、格里高利历、农历、印加帝国的太阳历、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:可表示的最大日期或时间。