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(∞)
    

设计目标

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

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

不可避免的权衡

该库尽最大努力提供用户想要的一切,但存在某些固有的限制,限制了任何时间库可以做的事情。具体来说,用户必须在任何特定应用程序中选择以下三种功能中的哪两种

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

一些库可能隐式承诺提供所有这三种功能,但如果您实际对其进行测试,则一次只能实现两种功能。此限制不是任何特定库的设计或实现中的缺陷;而是由国际标准定义不同时间系统的方式造成的。让我们看看这三种情况

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

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

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

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

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

稳定性

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

如果将操作应用于特定操作数的结果不随时间变化,则该操作是稳定的。

可预测性

集合通常分为两类:定义明确的和定义不明确的。由于类型是一个集合,我们可以扩展这些定义以涵盖类型。对于任何类型 T,必须有一个谓词 is_member( x ) 来确定值 x 是否是类型 T 的成员。此谓词必须返回 true、falsedont_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) -- 一些地区在夏季进行的当地时间调整,以改变白天的小时数。
  • 时区 -- 地球上的一个区域,它提供由夏令时规则和 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 函数)。大多数库用户无需构建库即可有效使用该库,只需包含所需的头文件即可。如果需要该库,构建目录中的 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。格里高利系统不使用此宏,因此在构建库时无效。

从 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
  • Linux 上的 GCC 3.2 - 3.4, 4.x
  • Darwin 上的 GCC 3.3, 4.x
  • Solaris 上的 GCC 3.3 - 3.4, 4.x
  • HP-UX 上的 GCC 3.3, 4.x
  • QNX 上的 QCC 3.3.5
  • MSVC 7.1 Windows
  • Intel 8.1-9.x Linux 和 Windows

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

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

这些编译器支持该库的所有方面,但 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 需要在 STLPort makefile 中放置 /Zc:wchar_t。然后应使用 $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 和 date 构造是 constexpr。参见:PR 161PR 161
错误修复 在 Clang 上抑制 MSVC CRT 弃用警告。参见:PR 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)。
增强 使用 clang 10 时 C++20 模糊比较运算符警告 (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 #125,和 GitHub issue #116

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

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

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

类型 描述
更改 时间段的默认格式现在是“%- %O:%M:%S%F”而不是以前使用的“%- %H:%M:%S%F”。为了保留旧的行为,必须在时间 IO facet 构造期间显式指定格式字符串(#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_calc_engine 和自定义 dst 特征类的类的接口发生了变化。特征类签名更改为在大多数方法(例如 end_month)上采用“year”参数。此外,特征类上还需要 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 特征 (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)

类型 描述
错误修复 当起点和终点相同时或连续时,周期长度计算不正确。更正后的行为,其中结束点和起始点相等,或者创建了持续时间为零的周期,现在返回长度为零。起点和终点连续的周期将返回长度为 1。
错误修复 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 已被重写,以支持基于格式的格式重新定义(完整详细信息请参阅日期时间输入/输出)。
特性 添加了函数以便于在 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 的特殊值(非日期时间、无穷大等)无法从存档中正确读取。输出序列化代码编写了 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 年 2 月 28 日(闰年且非月末)开始迭代到下一个闰年会导致 2004 年 2 月 29 日而不是 2004 年 2 月 28 日。此行为已得到纠正,以产生正确的结果 2004 年 2 月 28 日。感谢 Bart Garst 的这项更改。
特性 用于从 FILETIME 结构创建 ptime 对象的自由函数。此函数仅在定义了 BOOST_HAS_FTIME 的平台上可用。
特性 微秒时钟现在在大多数 Windows 编译器和 Unix 上都可用。
特性 现在大多数 date_time 类都可以使用 boost::serialization 库。能够序列化的类有: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 的这项更改。
特性 周期类现在可以正确处理零长度和 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 的这项更改。
特性 将 date_generators 的统一基类引入 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() 中的一个错误,该错误会导致格式化的小数位数少于完整数量的字符串创建不正确的时间持续时间。如果时间持续时间的分辨率为微秒,则字符串“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 编写此代码。此外,还改进了计算的文档。
错误修复 将 typedef 添加到 boost::gregorian gregorian_types.hpp 各种 date_generator 函数类。
特性 添加了 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 的这项工作。
特性 为持续时间添加了一元运算符,用于反转时间持续时间的符号。例如
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 类(请参阅date_algorithms)的接口已更改。构造参数的顺序已更改,这将导致某些代码执行失败。进行此更改是为了促进更通用的本地时间调整代码。因此,代码需要从指定 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_periods 和 time_periods 现在都支持此函数。
错误修复 拆分 Jamfiles,使 libs/date_time/build/Jamfile 只构建库,/libs/date_time/libs/test/Jamfile 运行测试。
错误修复 修复了许多细微的文档问题。
错误修复 删除了导致链接错误的 DATE_TIME_INLINE 宏。使用该库的项目不再需要此宏。
错误修复 在 gregorian_types.hpp 中添加了缺失的 year_iterator 类型定义。
错误修复 修复了阻止使用宽流的 gregorian ostream 运算符的问题。
错误修复 加强了日期的错误处理,以便 date(2002, 2, 29) 将抛出 bad_day_of_month 异常。以前该日期会被错误地构造。由 SourceForge bug: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