Boost C++ 库

...世界上最受尊敬和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

详情

计算
设计目标
权衡:稳定性、可预测性和近似值
术语
参考文献
构建-编译器信息
测试
变更历史
致谢

计算

时间点 -- 持续时间 -- 间隔(周期) -- 特殊值处理

时间点

本节介绍一些可以对时间点执行的基本算术规则。一般来说,时间点支持与持续时间结合的基本算术运算,如下所示

      Timepoint + Duration  --> Timepoint
      Timepoint - Duration  --> Timepoint
      Timepoint - Timepoint --> Duration
    

与常规数字类型不同,以下操作未定义

      Duration + Timepoint  --> Undefined
      Duration - Timepoint  --> Undefined
      Timepoint + Timepoint --> Undefined
    

持续时间

持续时间表示一段时间长度,可以有正值和负值。能够对其他持续时间和简单的整数值执行计算通常很有用。以下描述了这些计算

      Duration + Duration  --> Duration
      Duration - Duration  --> Duration
      
      Duration * Integer   --> Duration
      Integer  * Duration  --> Duration
      Duration / Integer   --> Duration  (Integer Division rules)
    

间隔(周期)

间隔逻辑对于简化日期和时间的许多“计算”非常有用。以下描述了基于半开区间的周期提供的操作。以下操作基于两个输入时间周期计算新的时间周期

Timeperiod intersection Timeperiod --> Timeperiod 
  (null interval if no intersection)
Timeperiod merge Timeperiod        --> Timeperiod 
  (null interval if no intersection)
Timeperiod shift Duration          --> Timeperiod 
  (shift start and end by duration amount)
    

此外,周期支持各种查询,用于计算布尔结果。第一组是与其他时间周期的计算

  Timeperiod == Timeperiod           --> bool
  Timeperiod < Timeperiod            --> bool (true if lhs.last <= rhs.begin)
  Timeperiod intersects Timeperiod   --> bool
  Timeperiod contains Timeperiod     --> bool
  Timeperiod is_adjacent Timeperiod  --> bool 
    

以下计算是针对时间点执行的。

  Timeperiod contains Timepoint      --> bool
  Timeperiod is_before Timepoint     --> bool
  Timeperiod is_after Timepoint      --> bool 
    

特殊值处理

对于许多时间问题,持续时间和时间点类型支持特殊值(例如非日期时间 (NADT) 和无穷大)非常有用。一般来说,诸如非日期时间 (NADT) 和无穷大之类的特殊值应遵循类似于浮点值的规则。请注意,应可以配置基于 NADT 的系统,使其抛出异常而不是导致 NADT。

  Timepoint(NADT) + Duration --> Timepoint(NADT)
  Timepoint(∞) + Duration    --> Timepoint(∞)
  Timepoint + Duration(∞)    --> Timepoint(∞)
  Timepoint - Duration(∞)    --> Timepoint(-∞)
    

当对正无穷大和负无穷大执行操作时,库将产生与以下内容一致的结果。

  Timepoint(+∞) + Duration(-∞) --> NADT
  Duration(+∞) + Duration(-∞)  --> NADT
  Duration(±∞) * Zero          --> NADT
  
  Duration(∞) * Integer(Not Zero) --> Duration(∞)
  Duration(+∞) * -Integer         --> Duration(-∞)
  Duration(∞) / Integer           --> Duration(∞)
    

设计目标

类别 描述
功能
接口 提供用于操作日期和时间的具体类
  • date, time, date_duration, time_duration, date_period, time_period 等
  • 支持无穷大 - 正无穷大、负无穷大
  • 时间和日期范围的迭代器
  • 允许日期和时间实现尽可能分离
计算 为执行高效的时间计算提供基础
  • 日期之间的天数
  • 时间的持续时间
  • 日期和时间的总持续时间
表示灵活性 提供最大的可重用性和灵活性
  • 基于 traits 的内部表示自定义,用于大小与分辨率控制
  • 允许使用不同的纪元和分辨率(例如:秒与微秒,日期从 2000 年开始与日期从 1700 年开始)
  • 配置唯一日历表示形式的选项(公历 + 其他)
  • 儒略日数字的使用以及其与公历/儒略历日期之间的转换
  • 允许灵活调整,包括闰秒
日期计算 提供日期计算工具
  • 为计算复杂的事件规范(如节假日)提供基础
  • 日历到日历的转换
  • 提供扩展到新日历系统的能力
时间计算 提供用于操作时间的具体类
  • 提供处理跨时区问题的能力
  • 提供夏令时(夏季时间)调整
时钟接口 提供用于检索当前时间的类
  • 访问网络/高分辨率时间源
  • 检索当前日期时间信息以填充类
I/O 接口 为时间提供输入和输出,包括
  • 多语言支持
  • 提供符合 ISO8601 标准的时间方面
  • 使用 I/O 方面来实现不同的本地行为

权衡:稳定性、可预测性和近似值

不可避免的权衡

该库尽力提供用户可能想要的一切,但某些固有的约束限制了 任何 时间库可以执行的操作。具体来说,用户必须在任何特定应用程序中选择以下三个功能中的两个

  • 与挂钟时间完全一致
  • 精确的数学运算,例如持续时间计算
  • 处理未来时间点的能力

一些库可能会隐式承诺提供所有三个功能,但如果您实际进行测试,则一次只能满足两个。这种限制不是任何特定库的设计或实现的缺陷;相反,它是国际标准定义不同时间系统方式的结果。让我们看一下这三种情况中的每一种

如果您想要与挂钟时间完全一致,则必须使用 UTC 或本地时间。如果您通过从另一个 UTC 时间中减去一个 UTC 时间来计算持续时间,并且您想要精确到秒的答案,则这两个时间不能太遥远,因为闰秒会影响计数,但仅提前约 6 个月确定。对于本地时间,未来的持续时间计算可能会相差整整一个小时,因为立法机构可以并且确实可以随意更改 DST 规则。

如果您想要处理未来的挂钟时间,您将无法(在一般情况下)计算精确的持续时间,原因与上述相同。

如果您想要对未来时间进行精确计算,则必须使用 TAI 或等效项,但从 TAI 到 UTC 或本地时间的映射取决于闰秒,因此您将无法与挂钟时间完全一致。

稳定性、可预测性和近似值

以下是一些有助于解释正在发生情况的基础理论。请记住,时间类型与任何抽象数据类型 (ADT) 一样,是一组值以及对这些值的操作。

稳定性

类型的表示形式是 稳定 的,如果与给定值关联的位模式不会随时间变化。具有不稳定表示形式的类型不太可能对任何人有用,因此我们将坚持任何时间库仅使用稳定的表示形式。

类型上的操作是稳定的,如果将操作应用于特定操作数的结果不会随时间变化。

可预测性

集合通常分为两类:定义明确的和定义不明确的。由于类型是一个集合,我们可以扩展这些定义以涵盖类型。对于任何类型 T,必须有一个谓词 is_member( x ),它确定值 x 是否是类型 T 的成员。此谓词必须返回 true, false,dont_know

如果对于所有 x,is_member( x ) 返回 true 或 false,我们说集合 T 是 定义明确的

如果对于任何 x,is_member( x ) 返回 dont_know,我们说集合 T 是 定义不明确的

这些是数学中通常使用的规则。但是,由于时间类型的特殊特性,改进此视图并创建第三类是有用的,如下所示

对于任何时间类型 T,必须有一个谓词 is_member( x, t ),它确定值 x 是否是 T 的成员。参数 t 表示评估谓词的时间。对于每个 xi,必须有一个时间 ti 和一个值 v,使得

  • v = true 或 v = false,并且
  • 对于所有 t < ti,is_member( xi, t ) 返回 dont_know,并且
  • 对于所有 t >= ti,is_member( xi, t ) 返回 v。

ti 是我们“发现”xi 是否是 T 的成员的时间。现在我们可以定义三种时间类型类别

如果对于所有 xi,ti = 负无穷大,我们说类型 T 是 可预测的

如果对于某些 xi,ti = 正无穷大,我们说类型 T 是 形式错误的

否则,我们说类型 T 是 不可预测的(这意味着对于某些 xi,ti 是有限的)。

形式错误的集合没有太大的实际用途,因此我们不再进一步讨论它们。用简单的英语来说,以上只是说可预测类型的所有值都是提前已知的,但不可预测类型的某些值在某个特定时间之前是未知的。

操作的稳定性

可预测类型具有两个重要的属性

  • 从它们的元素到一组连续整数存在保序映射,并且
  • 对其值的持续时间操作是稳定的

这在实践中的效果是,持续时间计算可以使用简单的整数减法来实现。可预测类型的示例包括 TAI 时间点和公历日期。

不可预测类型具有完全相反的属性

  • 从它们的元素到一组连续整数不存在保序映射,并且
  • 对其值的持续时间操作是不稳定的。

不可预测类型的示例包括 UTC 时间点和本地时间时间点。

我们可以稍微改进一下,说不可预测类型中的范围可以是可预测的,并且完全在该范围内对值执行的操作将是稳定的。例如,从 1970-01-01 到现在的 UTC 时间点范围是可预测的,因此该范围内持续时间的计算将是稳定的。

近似值

这些限制是有问题的,因为重要的时间类型(如 UTC 和本地时间)实际上是不可预测的,因此对它们的操作有时是不稳定的。然而,在实践中,我们经常想要执行这种操作,例如计算以本地时间指定的未来两个时间点之间的持续时间。

库能做的最好的事情是提供近似值,这通常是可能的,并且对于大多数目的来说已经足够好了。当然,文档必须指定答案何时是近似值(因此是不稳定的)以及误差可能有多大。在许多方面,使用不可预测的集合进行计算类似于浮点数的使用,对于浮点数,结果预计仅是近似正确的。然后,使用可预测的集合进行计算将类似于整数的用户,其中结果预计是精确的。

对于需要精确答案或不能容忍不稳定性的情况,用户必须能够指定这一点,然后如果用户请求无法获得精确、稳定答案的计算,则库应抛出异常。

术语

以下是与日期时间领域相关的许多术语。

时间类型分类

  • 时间点 -- 时间连续体中位置的说明符。类似于标尺上的数字。
  • 时间长度 -- 未附加到时间连续体上任何点的持续时间。
  • 时间间隔 -- 附加到时间连续体上特定点的持续时间。

以及其他一些术语

  • 精度 -- 误差的度量,时钟读数与真实时间之间的差异。
  • 日历系统 -- 一种使用天级分辨率标记时间点的系统。
  • 时钟设备 -- 一种软件组件(与某些硬件相关联),用于提供相对于日历或时钟系统的当前日期或时间。
  • 精密度 -- 时钟重复性的度量。
  • 分辨率 -- 时钟/日历系统或时间类型的最小可表示持续时间(例如:1 秒,1 个世纪)的规范。
  • 稳定性 -- 类的属性,它表示与特定(抽象)值关联的底层表示形式(实现)永远不会更改。
  • 时间系统 -- 一种使用比天级分辨率更高分辨率标记时间点的系统。

一些标准日期时间术语

  • 纪元 -- 日历或时钟系统的起始时间点。
  • DST -- 夏令时 - 夏季在某些地区进行的本地时间调整,以移动白天时间的时钟时间
  • 时区 -- 地球上的一个区域,它提供由 DST 规则和 UT 偏移量定义的“本地时间”。
  • UTC 时间 -- 协调世界时 - 在经度零度测量的民用时间系统。通过使用闰秒保持与地球自转同步。也称为祖鲁时间。取代了类似的系统,称为格林威治标准时间。有关更多信息,请参见 http://aa.usno.navy.mil/faq/docs/UT.html
  • TAI 时间 -- 一种高精度单调(需要更好的术语)时间系统,由世界各地的原子钟测量到 0.1 微秒分辨率。不根据地球自转进行调整。有关更多信息,请参见 http://www.bipm.fr/enus/5_Scientific/c_time/time_server.html

更多实验性术语

  • 本地时间 -- 在宇宙特定位置测量的时间。
  • 时间标签 -- 一个元组,它完全或部分地指定了相对于日历或时钟系统的特定日期时间。这是年月日表示形式。
  • 调整时间长度 -- 一种持续时间,表示根据时间点而变化的物理持续时间。例如,1 个月的持续时间通常不是固定的天数,它取决于测量的日期来确定实际长度。

这些是设计类型的术语

  • 生成函数 -- 一种基于一个或多个参数生成一组特定时间点、长度或间隔的函数。

参考文献

该库的设计目前正在使用 Wiki 和电子邮件讨论进行演变。您可以在以下位置找到更多信息:Boost Wiki GDTL 起始页

日期日历参考文献

时间

其他 C/C++ 库

JAVA 日期 & 时间库快速参考

脚本语言库

相关商业和虚构页面

分辨率、精密度和精度

构建-编译器信息

概述 -- 编译选项 -- 编译器/可移植性说明 -- 目录结构 -- 所需的 Boost 库

概述

该库有一些函数需要创建库文件(主要是 to_string、from_string 函数)。大多数库用户可以有效地使用该库,而无需构建库,只需包含所需的头文件即可。如果需要该库,则 build 目录中的 Jamfile 将生成一个“静态”库 (libboost_date_time) 和一个“动态/共享”库 (boost_date_time),其中包含这些函数。请注意,要在不使用库的情况下使用该库(尤其是在 Windows 上),可能需要使用 BOOST_DATE_TIME_NO_LIB 标志作为编译选项。

编译选项

默认情况下,posix_time 系统在内部使用单个 64 位整数来提供微秒级分辨率。作为替代方案,可以使用 64 位整数和 32 位整数(96 位分辨率)的组合来提供纳秒级分辨率。对于许多不需要纳秒分辨率的应用程序,默认实现可能会提供更好的性能和更紧凑的内存使用。

要使用备用分辨率(96 位纳秒),必须在库用户的项目文件(即 Makefile、Jamfile 等)中定义变量 BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG。此宏不被 Gregorian 系统使用,因此在构建库时无效。

从 1.33 版本开始,date_time 库引入了一个新的 IO 流系统。某些编译器无法使用此新系统。对于这些编译器,早期(“旧版”)IO 系统仍然可用。不受支持的编译器将自动选择旧版系统,但用户可以通过定义 USE_DATE_TIME_PRE_1_33_FACET_IO 来强制使用旧版系统。

为了方便起见,date_time 提供了一些附加的持续时间类型。由于捕捉到月末的行为,使用这些类型可能会产生意外的结果(有关完整详细信息和示例,请参阅操作可逆性陷阱)。默认情况下启用这些类型。要禁用这些类型,只需在您的项目文件中取消定义 BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES

另一个便利之处是 dateptime 的默认构造函数。默认情况下启用这些构造函数。要禁用它们,只需在您的项目文件中定义 DATE_TIME_NO_DEFAULT_CONSTRUCTOR

编译器/可移植性说明

Boost Date-Time 库已使用许多编译器和平台构建和测试。但是,某些编译器和标准库存在问题。虽然可以解决其中一些问题,但其他问题很难解决。已知以下编译器完全支持该库的所有方面

  • Codewarrior 9.4 Windows
  • GCC 3.2 - 3.4, 4.x on Linux
  • GCC 3.3, 4.x on Darwin
  • GCC 3.3 - 3.4, 4.x on Solaris
  • GCC 3.3, 4.x on HP-UX
  • QCC 3.3.5 on QNX
  • MSVC 7.1 Windows
  • Intel 8.1-9.x Linux 和 Windows

不幸的是,VC8 编译器在日期时间代码方面存在一些问题。最严重的问题是内存泄漏,该泄漏已引入 VC8 标准库 basic_stream 代码中。日期时间代码已更改为尽可能避免这种情况,但如果您使用旧版 IO 选项(VC8 的非默认选项),则问题仍然可能出现。有关更多详细信息,请参见邮件列表存档

除了上述问题外,某些版本的 VC8 库还将 std::tm 结构中允许的值范围限制为正值。这是 VC8 中添加的新限制。其影响是 1900 年之前的日期将导致异常。不幸的是,这个问题没有简单的解决方法。请注意,新 64 位版本的 VC8 编译器似乎没有此限制。

这些编译器支持该库的所有方面,除了 wstring/wstream 输出。

  • MinGW 3.2, 3.4, 3.5 *
  • GCC 3.2 (cygwin) *

特别是,缺乏对标准区域设置的支持限制了库支持基于 iostream 的输入输出的能力。对于这些编译器,提供了一组更有限的基于字符串的输入输出。具有此限制的一些编译器/标准库包括

  • Borland 5.6

现在已放弃对某些旧编译器的官方支持。这包括

  • GCC 2.9x
  • Borland 5.1.1
  • MSVC 7.0 和 6 SP5

Visual Studio & STLPort

Visual Studio (7.0 & 7.1) 和 STLPort 存在已知问题。构建错误通常引用类型问题或“不可接受的转换”,并且尝试使用 wchar_t 实例化模板。STLPort 的默认构建不支持 wchar_t。此问题有两种可能的解决方法。最简单的方法是用户可以在没有宽流/字符串等的情况下构建 date_time。另一种方法是使用 wchar_t 支持重建 STLPort。

要在没有宽流/字符串等的情况下构建 date_time,请从 $BOOST_ROOT 执行以下命令

bjam -a "-sTOOLS=vc-7_1-stlport" "-sSTLPORT_PATH=..." \
     "-sBUILD=<define>BOOST_NO_STD_WSTRING"           \
     --stagedir=... --with-date_time stage

(用构建系统的正确路径替换省略号,并在必要时将 TOOLS 调整为正确的工具集)

使用 wchar_t 支持重建 STLPort 涉及将 /Zc:wchar_t 放在 STLPort makefile 中。然后应使用以下命令从 $BOOST_ROOT 构建 date_time

bjam -a "-sTOOLS=vc-7_1-stlport" "-sSTLPORT_PATH=..." \
     "-sBUILD=&native-wchar_t>on"                     \
     --stagedir=... --with-date_time stage

(用构建系统的正确路径替换省略号,并在必要时将 TOOLS 调整为正确的工具集)

目录结构

目录树具有以下结构

/boost/date_time                   -- common headers and template code
/boost/date_time/gregorian         -- Gregorian date system header files
/boost/date_time/posix_time        -- Posix time system headers
/boost/date_time/local_time        -- Local time system headers
/libs/date_time/build              -- build files and output directory
/libs/date_time/test               -- test battery for generic code
/libs/date_time/test/gregorian     -- test battery for the Gregorian system
/libs/date_time/test/posix_time    -- test battery for the posix_time system
/libs/date_time/test/local_time    -- test battery for the local_time system
/libs/date_time/example/gregorian  -- example programs for dates
/libs/date_time/example/posix_time -- time example programs
/libs/date_time/example/local_time -- nifty example programs
/libs/date_time/src/gregorian      -- cpp files for libboost_date_time
/libs/date_time/src/posix_time     -- empty (one file, but no source code...)

所需的 Boost 库

date-time 的各个部分依赖于其他 boost 库。这些包括

因此需要安装这些库。

测试

该库在

      libs/date_time/test
      libs/date_time/test/gregorian
      libs/date_time/test/posix_time
      libs/date_time/test/local_time
    

目录中提供了大量测试。构建和执行这些测试可确保安装正确且库运行正常。此外,这些测试有助于移植到新的编译器。最后,这些测试提供了许多用法示例中未明确描述的函数的示例。

变更历史

从 Boost 1.73 到 1.74 的更改

类型 描述
错误修复 修复 constrained_value::assign 为 constexpr,以便 ptime 和日期构造为 constexpr。参见:pull 161pull 161
错误修复 在 Clang 上抑制 MSVC CRT 弃用。参见:pull 160

从 Boost 1.72 到 1.73 的更改

类型 描述
增强 使 date_time 全部内联。用户不再需要链接任何库函数的库。请注意,为空存根库维护了向后兼容性。解决:(github issue #134)和(github issue #85)。删除链接库以解决链接/可见性问题
增强 当在 c++14 模式及更高版本中时,已添加对 constexpr 的支持。例如: constexpr microseconds ms(1000); static_assert(ms.total_microseconds() == 1000, "constexpr total_microseconds"); github issue #123)。
增强 C++20 clang 10 的歧义比较运算符警告(github issue #132)。
清理 已弃用对旧版 io 和 USE_DATE_TIME_PRE_1_33_FACET_IO 宏的支持(github issue #61)。
错误修复 gettimeofday、day_number 和 from_iso_extended_string 的文档澄清。github issue #127 github issue #125github issue #116

从 Boost 1.41 到 1.44 的更改(date_time 1.08 到 1.09)

类型 描述
错误修复 格式说明符“%T”和“%R”现在由库而不是底层标准方面处理。这修复了方面不支持占位符的情况(#3876)。

从 Boost 1.40 到 1.41 的更改(date_time 1.07 到 1.08)

类型 描述
更改 时间持续时间的默认格式现在为“%-%O:%M:%S%F”,而不是之前使用的“%-%H:%M:%S%F”。为了保留旧的行为,必须在时间 IO 方面构造期间显式指定格式字符串(#1861)。
错误修复 格里高利日期现在在 64 位平台上内部使用 32 位整数类型(#3308)。
错误修复 调整了 UTC 时区偏移边界,以便允许高达 +14 小时的偏移量(#2213)。

从 Boost 1.38 到 1.40 的更改(date_time 1.06 到 1.07)

类型 描述
错误修复 小错误修复(#2809#2824#3015#3105 等)。

从 Boost 1.34 到 1.38 的更改(date_time 1.05 到 1.06)

类型 描述
功能 添加了对格式化和读取超过 24 小时的时间持续时间的支持。新的格式化程序 %O 用于指示格式字符串中此类长持续时间。旧的 %H 格式说明符因此被限制为表示适合两个字符的持续时间,以便保留对读取 ISO 格式持续时间的支持。如果在调试版本中检测到 %H 格式说明符与更长的持续时间一起使用,则结果未指定(引发断言)。
错误修复 添加了对 GCC 4.3 的支持。解决了一些编译问题,并处理了编译器警告。
错误修复 local_time_period 类添加了缺少的流运算符。
错误修复 在不同位置添加了几个缺少的包含项。某些配置中不需要的某些包含项已设置为有条件。
错误修复 解决了由于未通过 ADL 查找 gregorian::date_duration 的流运算符而引起的编译问题。该类型现在实际上是一个类,而不是 date_time::date_duration 模板的 typedef。对 gregorian::weeks 进行了类似的更改。
错误修复 添加了正确拼写的 date_time::hundredth 时间分辨率枚举值。旧的 date_time::hundreth 被认为是已弃用,将在未来的版本中删除。
错误修复 修复了由于使用了不正确的流类型而导致的 format_date_parser.hpp 中的编译错误。
错误修复 在 Windows 平台上,使包含 windows.h 成为可选。标头仅在定义了 BOOST_USE_WINDOWS_H 宏时使用。否则(默认情况下),库使用此标头中符号的内部定义。
错误修复 在 Windows 平台上,如果传递给函数的 FILETIME 包含 1970 年 1 月 1 日之前的日期,则函数 from_ftime 可能会返回不正确的时间。
错误修复 修复了如果字符串不表示有效的特殊值,则 gregorian::special_value_from_string 中可能发生的崩溃。
错误修复 从公共包含目录中删除了 testfrmwk.hpp 文件。此文件是库测试的内部文件,未记录在文档中。
错误修复 修复了 filetime_functions.hpp 中缺少的包含项(#2688)。
错误修复 修复了代码不同位置中取消引用结束字符串迭代器的问题,这可能会导致 MSVC 崩溃(#2698)。

从 Boost 1.33 到 1.34 的更改(date_time 1.04 到 1.05)

类型 描述
功能 更新了 date_time_zonespec.csv 文件中的数据,以反映 2007 年美国/加拿大夏令时新规则。如果您升级到新文件,请注意,该库仅对当前/未来的日期转换给出正确的答案。因此,如果您转换较早年份的日期,则答案将反映当前时区规则,而不是过去规则。该库目前不支持历史时区规则。
功能 另外两个 dst 计算功能也已更新,以反映美国/加拿大时区新规则。这是 boost::date_time::us_dst_rules 和 dst_calc_engine。虽然 us_dst_rules 已正式弃用,但 Graham Bennett 应用了一个补丁,该补丁允许此类在历史和未来日期都能正确工作。dst_calc_engine 也已更新为可在历史和未来时间工作。这允许各种 local_adjustor 类正确工作。使用具有自定义 dst traits 类的 dst_calc_engine 的类存在接口更改。traits 类签名已更改为在大多数方法(如 end_month)上采用“year”参数。此外,traits 类还需要 2 个新函数:static date_type local_dst_start_day(year_type year)static date_type local_dst_end_day(year_type year)。实现者应参阅 date_time/local_timezone_defs.hpp 以获取示例。
错误修复 修复了澳大利亚的 DST traits(sf# 1672139),将 DST 结束时间设置为凌晨 3:00 而不是凌晨 2:00。
错误修复 修复了由于 I/O 代码导致的多个定义而可能出现的链接错误问题。
错误修复 更改了 greg_serialize.hpp 和 time_serialize.hpp 中的序列化代码,以消除由于版本和 file_version 的未使用变量而引起的警告。感谢 Caleb Epstein 的补丁建议。
错误修复 修复了在 FreeBSD 和 GCC 环境下,当 LANG 环境变量设置为俄语时出现的回归错误 -- 将解析器更改为使用经典区域设置,而不是空白区域设置。
错误修复 针对跟踪问题 1178092 的更改 -- 更改 convert_to_lower 使 local 成为 const static 并加速解析。
错误修复 来自 Ulrich Eckhardt 的补丁,用于修复对 EVC++ 4 的支持。
功能 尽可能减少 basic_stringstream 的使用,以解决 VC8 标准库中的一个错误。 请参阅 邮件列表存档 以获取更多信息。

从 Boost 1.32 到 1.33 的更改 (date_time 1.03 到 1.04)

类型 描述
错误修复 当起始点和结束点相同或连续时,期间长度的计算不正确。 现在已更正此行为,当结束点和起始点相等时,或创建持续时间为零的期间时,将返回长度零。 起始点和结束点连续的期间将返回长度一。
错误修复 Time_input_facet 缺少设置 iso 格式的函数。 它也无法解析未使用分隔符 (%H%M%S) 的时间值。 这些错误均已得到纠正。
功能 ptime_facet 和 ptime_input_facet 的初步名称已更改为 time_facet 和 time_input_facet。 ptime_* 版本已完全移除。
功能 from_iso_string 函数无法解析小数位数。 我们添加了代码,以便在输入的小数位数多于或少于编译库精度时正确解析。 仅包含小数点的 Ptime 也被正确解析。
错误修复 新 IO 中的解析机制会消耗在匹配后出现的下一个字符。 当尝试解析具有特殊起始点的期间时,此错误会显现出来。
错误修复 新的 IO 系统未能提供用户“启用”流异常的功能。 解析失败时,failbit 也未设置。 这些问题均已得到修复。
错误修复 通过 from_*_string 函数解析特殊值的问题已得到修复。 这也影响了库序列化特殊值的能力。 Time_duration 现在序列化为字符串或单个字段(取决于 is_special())。
错误修复 以前,partial_date 的输出流会将日期显示为单位数或两位数整数(例如“1”或“12”)。 现在已更正为始终显示两位数整数(例如“01”)。
功能 与本地时间管理相关的主要新功能。 这包括引入一系列新类来表示时区和本地时间(有关完整详细信息,请参阅 日期时间本地时间)。
功能 输入和输出 facet 已被重写,以支持基于格式的格式重新定义(有关完整详细信息,请参阅 日期时间 IO)。
功能 添加了函数以方便 dateptimetime_durationlocal_date_timetm 结构之间的转换。 还提供了用于将 FILETIMEtime_t 转换为 ptime 的函数。 有关详细信息,请参阅各个部分。
功能 microsec_time_clock 中添加了 universal_time 函数(此函数的完整详细信息可以在此处找到)。
功能 添加了函数以方便 dateptimetime_durationlocal_date_timetm 结构之间的转换。 还提供了用于将 FILETIMEtime_t 转换为 ptime 的函数。 有关详细信息,请参阅各个部分。
功能 microsec_time_clock 中添加了 universal_time 函数(此函数的完整详细信息可以在此处找到)。
功能 当定义了 BOOST_HAS_THREADS 时,日期时间现在在支持这些平台的平台上使用可重入 POSIX 函数。
错误修复 修复了序列化代码中的一个错误,该错误导致 ptime 和 time_duration 的特殊值(not-a-date-time、无穷大等)无法从存档中正确读取。 输出序列化代码写入了诸如 time_duration.seconds() 之类的子字段,这些子字段对于特殊值无效,因此是未定义的值。 因此,当读取回这些值时,可能会导致奇怪的行为,包括构造时出现异常。
错误修复 修复了在各种平台/编译器上生成的多个警告。
错误修复 现在,使用超出 00:00 到 23:59:59.9... 范围的 time_duration 构造 ptime 会调整日期和时间,以使 time_duration 落在该范围内(即 ptime(date(2005,2,1), hours(-5)) -> "2005-Jan-31 19:00:00" & ptime(date(2005,2,1), hours(35)) -> "2005-Feb-02 11:00:00")。
错误修复 时间解析现在可以正确处理小数秒的过多位数。 前导零被删除(“000100” -> 100 frac_sec),过多的位数在适当的位置被截断(“123456789876” -> 123456 或 123456789,具体取决于库编译的精度)。
错误修复 boost::serialization 接口的更改破坏了 date_time 的序列化兼容性。 用户必须提供一个函数来确保 date_time 对象在序列化之前是 const。 该函数应类似于
template<class archive_type, class temporal_type>
void save_to(archive_type& ar,
             const temporal_type& tt)
{
  ar << tt;
}
错误修复 已将不推荐使用的 boost::tokenizer 接口更新为当前接口。 这修复了一些旧编译器上的编译器错误。
错误修复 旧 IO 系统中模板化的格式化程序接受 char 类型。 还移除了对 boost::lexical_cast 的调用。

从 Boost 1.31 到 1.32 的更改 (date_time 1.02 到 1.03)

类型 描述
错误修复 更正了 year_functor 的月末捕捉行为。 之前,从 2000-Feb-28(闰年且不是月末)开始,并迭代到下一个闰年将导致 2004-Feb-29 而不是 2004-Feb-28。 此行为已得到纠正,以产生正确的 2004-Feb-28 结果。 感谢 Bart Garst 进行了此更改。
功能 从 FILETIME 结构创建 ptime 对象的自由函数。 此函数仅在定义了 BOOST_HAS_FTIME 的平台上可用。
功能 微秒时间时钟现在在大多数 Windows 编译器以及 Unix 上可用。
功能 boost::serialization 库的使用现在可用于大多数 date_time 类。 可以序列化的类包括:date_generator 类、date、days、date_period、greg_month、greg_weekday、greg_day、ptime、time_duration 和 time_period。 感谢 Bart Garst 进行了此更改。
功能 添加了将日期和时间类转换为 wstring 的函数。 该库现在为支持 wstring 的日期和编译器提供了 to_*_wstring 以及 to_*_string 函数,用于:simple、iso、iso_extended 和 sql。 感谢 Bart Garst 进行了此更改。
功能 Period 类现在可以正确处理零长度和 NULL 期间。 NULL 期间是长度为负的期间。 感谢 Frank Wolf 和 Bart Garst 进行了此更改。
功能 向 gregorian::date 添加了 end_of_month 函数,以返回日期表示的当前月份的最后一天。 对于 not_a_date_time 或无穷大,结果未定义。
错误修复 移除了整个库中 BOOST_NO_CWCHAR 宏的不正确用法。
功能 为某些日期类添加了新名称。 原始名称仍然有效,但将来可能会被弃用。 更改如下:
date_duration 现在是 days
nth_kday_of_month 现在是 nth_day_of_the_week_in_month
first_kday_of_month 现在是 first_day_of_the_week_in_month
last_kday_of_month 现在是 last_day_of_the_week_in_month
first_kday_after 现在是 first_day_of_the_week_after
first_kday_before 现在是 first_day_of_the_week_before
功能 为日期生成器添加了自由函数。 函数包括:days_until_weekday、days_before_weekday、next_weekday 和 previous_weekday。
days days_until_weekday(date, greg_weekday);
days days_before_weekday(date, greg_weekday);
date next_weekday(date, greg_weekday);
date previous_weekday(date, greg_weekday);
感谢 Bart Garst 进行了此更改。
功能 为月、年和周添加了新的实验性持续时间类型。 这些类还提供用于日期和时间类的数学运算符。 请注意,向一个月的 28 日之后的日期或时间添加月份或年份可能会显示非正常的数学属性。 这是计算中使用的“月末”捕捉的结果。 下面的最后一个示例说明了这个问题。
months m(12);
years y(1);
m == y; // true
days d(7);
weeks w(1);
d == w; // true
ptime t(...);
t += months(3);
date d(2004,Jan,30);
d += months(1); //2004-Feb-29
d -= months(1); //2004-Jan-29
这些类型的输入流式传输尚未实现。 感谢 Bart Garst 进行了此更改。
功能 将日期生成器的统一基类引入 gregorian 命名空间。 请参阅 打印节日示例
功能 为 date 和 ptime 添加了允许默认构造(两者)和特殊值构造(ptime,现在两者都支持)的构造函数。 默认构造函数将对象初始化为 not_a_date_time (NADT)。
ptime p_nadt(not_a_date_time);
ptime p_posinf(pos_infin);
ptime p; // p == NADT
date d;  // d == NADT
感谢 Bart Garst 进行了此更改。
功能 输出流式传输现在支持在支持宽流的编译器/标准库组合上进行宽流输出。 这允许像这样的代码:
std::wstringstream wss;
date d(2003,Aug,21);
wss << d;
感谢 Bart Garst 进行了此更改。
功能 日期和时间类型的输入流式传输现在在宽流和窄流上都受支持
date d(not_a_date_time);
std::stringstream ss("2000-FEB-29");
ss >> d; //Feb 29th, 2000
std::wstringstream ws("2000-FEB-29");
ws >> d; //Feb 29th, 2000
感谢 Bart Garst 进行了此更改。
错误修复 修复了 duration_from_string() 中的错误,其中使用少于完整小数位数的字符串创建了不正确的 time_duration。 对于时间持续时间的微秒分辨率,字符串“1:01:01.010”创建的时间持续时间为 01:01:01.000010 而不是 01:01:01.010000。
错误修复 修复了使用 min_date_time 或 max_date_time 构造时 gregorian::date 和 posix_time::ptime 的特殊值构造函数。 为这些构造了错误的值。

从 Boost 1.30 到 1.31 的更改 (date_time 1.01 到 1.02)

类型 描述
错误修复 更新了构建配置,以便现在使用 MSVC 编译器生成 dll、静态和动态链接库文件。 有关更多详细信息,请参阅 构建/编译器信息
错误修复 Time_duration from_string 现在可以从负值正确构造(例如“-0:39:00.000”)。 代码由 Bart Garst 提供。
错误修复 修复了使用警告级别 4 编译时出现的许多 MSVC 编译器警告。
功能 为日期和时间迭代器添加了前缀递减运算符 (--)。 有关更多详细信息,请参阅 时间迭代器日期迭代器。 代码由 Bart Garst 提供。
功能 为 date_duration、time_duration 和 time 类添加了 Special_values 功能。 代码由 Bart Garst 提供。
错误修复 修复了 time_duration_traits 计算错误,该错误导致时间持续时间被限制为 32 位范围,即使 64 位可用。 感谢 Joe de Guzman 跟踪到此问题。
错误修复 为持续时间类型(例如:date_duration、time_duration)提供了其他运算符。 这包括可被整数除,并修复了以允许 +=、-= 运算符。 感谢 Bart Garst 编写了此代码。 此外,计算的文档也得到了改进。
错误修复 向 boost::gregorian gregorian_types.hpp 添加了各种 date_generator 函数类的 typedef。
功能 添加了 from_time_t 函数以将 time_t 转换为 ptime。
功能 为组合期间添加了 span 函数。 请参阅 日期期间时间期间 文档。
功能 向 time_duration 添加了一个函数,以获取持续时间中的总秒数,截断任何小数秒。 此外,还添加了其他分辨率以方便转换。 例如:
seconds(1).total_milliseconds() == 1000
seconds(1).total_microseconds() == 1000000
hours(1).total_milliseconds() == 3600*1000 //3600 sec/hour
seconds(1).total_nanoseconds() == 1000000000
功能 日期生成器 类(partial_date、first_kday_after、first_kday_before 等)添加了输出流运算符。 感谢 Bart Garst 的这项工作。
功能 为持续时间添加了 unary- 运算符,用于反转时间持续时间的符号。 例如:
time_duration td(5,0,0); //5 hours
td = -td; //-5 hours
感谢 Bart Garst 的这项工作。
功能 添加了对解析带有“月份名称”的字符串的支持。 因此,现在可以使用多种格式(“2003-10-31”、“2003-Oct-31”和“2003-October-31”)从字符串创建日期对象。 因此,现在允许使用 date d = from_simple_string("2003-Feb-27")。 错误的月份名称字符串 (from_simple_string("2003-SomeBogusMonthName-27")) 将导致 bad_month 异常。 在大多数编译器上,字符串比较不区分大小写。 感谢 Bart Garst 的这项工作。
功能 除了支持月份名称或数字外,还添加了函数以从多重排序的日期字符串创建日期对象。 例如:“January-21-2002”、“2002-Jan-21”和“21-Jan-2003”。 有关更多详细信息,请参阅 日期类
错误修复 各种文档修复。 感谢 Bart Garst 的更新。

从 Boost 1.29 到 1.30 的更改 (date_time 1.00 到 1.01)

注意:partial_date 类(请参阅 日期算法)的接口已更改。 构造参数的顺序已更改,这将导致某些代码执行失败。 此更改是为了方便更通用的本地时间调整代码。 因此,代码需要从指定 partial_date pd(Dec,25) 更改为 partial_date pd(25, Dec);

类型 描述
错误修复 为夏令时计算添加了新的实验性功能。 这允许基于特征的 dst 规则规范。
功能 向 gregorian 日期类添加了用于计算儒略日和修正儒略日的新接口。 请参阅 boost::gregorian::date
功能 添加了用于计算日期的 iso 8601 周数的新接口。 请参阅 boost::gregorian::date
功能 添加了 iso 8601 时间日期时间格式(例如:YYYYMMDDTHHHMMSS)解析函数。 有关更多信息,请参阅 Ptime 类
功能 向 period 模板添加了 length 函数,以便 date_period 和 time_period 现在都将支持此函数。
错误修复 拆分 Jamfiles,以便 libs/date_time/build/Jamfile 仅构建库,而 /libs/date_time/libs/test/Jamfile 运行测试。
错误修复 修复了许多小的文档问题。
错误修复 移除了导致链接错误的 DATE_TIME_INLINE 宏。 在使用库的项目中不再需要此宏。
错误修复 向 gregorian_types.hpp 添加了缺少的 year_iterator 的 typedef。
错误修复 修复了阻止使用宽流的 gregorian ostream 运算符的问题。
错误修复 加强了日期错误处理,以便 date(2002, 2, 29) 将抛出 bad_day_of_month 异常。 以前,日期将被错误地构造。 由 sourceforge 错误报告:628054 等。

致谢

许多人为该库的开发做出了贡献。 特别感谢 Hugo Duncan 和 Joel de Guzman 在移植到各种编译器方面的帮助。 对于概念和设计的初步开发,Corwin Joy 和 Michael Kenniston 值得特别感谢。 还要特别感谢 Michael 撰写了文档的理论和权衡部分。 感谢 Dave Zumbro 的最初灵感和明智的想法。 非常感谢 boost 审阅者和用户,包括:William Seymour、Kjell Elster、Beman Dawes、Gary Powell、Andrew Maclean、William Kempf、Peter Dimov、Chris Little、David Moore、Darin Adler、Gennadiy Rozental、Joachim Achtzehnter、Paul Bristow、Jan Langer、Mark Rodgers、Glen Knowles、Matthew Denman 和 George Heintzelman。


PrevUpHomeNext