Boost C++ 库

世界上评价最高、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

详细信息 - Boost 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 等
  • 支持无穷大 - 正无穷大、负无穷大
  • 遍历时间和日期范围的迭代器
  • 尽可能将日期和时间实现分离
计算 为高效执行时间计算提供基础
  • 日期之间的天数
  • 时间的持续时间
  • 日期和时间的组合持续时间
表示灵活性 提供最大的可重用性和灵活性
  • 基于特性的内部表示定制,用于大小与分辨率控制
  • 允许使用不同的纪元和分辨率(例如:秒与微秒、以 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 = negative infinity,则我们称类型 T 是可预测的

如果对于某些 xi,ti = positive infinity,则我们称类型 T 是格式不正确

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

格式不正确的集合没有实际用途,因此我们不再讨论它们。通俗地说,上面的意思只是一个可预测类型的所有值都是提前已知的,但一个不可预测类型的一些值要到某个特定时间才会被知道。

操作的稳定性

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

  • 其元素与一组连续整数之间存在一个保序映射,并且
  • 对其值的持续时间操作是稳定的。

其实际效果是,持续时间计算可以通过简单的整数减法来实现。可预测类型的示例如 TAI 时间点和公历日期。

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

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

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

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

近似值

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

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

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

术语

以下是一些与日期时间域相关的术语:

时间类型的分类

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

以及其他一些术语:

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

一些标准的日期时间术语

  • 纪元 - 日历或时钟系统的开始时间点。
  • DST - 夏令时 - 在夏季,一些地区为了调整日光时间而进行的本地时间调整。
  • 时区 - 地球上一个区域,通过 DST 规则和 UT 偏移量定义“本地时间”。
  • UTC 时间 - 协调世界时 - 在零经度测量的民用时间系统。通过使用闰秒来调整与地球自转的同步。也称为 Zulu 时间。取代了类似的格林威治标准时间系统。更多信息请参阅 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。此宏不被 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 and Windows

不幸的是,VC8 编译器在日期时间代码方面存在一些问题。最严重的问题是 VC8 标准库 basic_stream 代码中引入的内存泄漏。Date-time 代码已进行了修改以尽可能避免此问题,但如果您使用的是旧版 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 and 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 的更改

类型 描述
Bug 修复 将 constrained_value::assign 设置为 constexpr,以便 ptime 和 date 构造为 constexpr。请参阅:pull 161pull 161
Bug 修复 在 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)。
Bug 修复 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)

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

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

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

Boost 1.38至1.40(date_time 1.06至1.07)的更改

类型 描述
Bug 修复 次要的错误修复(#2809#2824#3015#3105及其他)。

Boost 1.34至1.38(date_time 1.05至1.06)的更改

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

Boost 1.33至1.34(date_time 1.04至1.05)的更改

类型 描述
功能 更新了date_time_zonespec.csv文件中的数据,以反映2007年美国/加拿大的夏令时新规则。如果您升级到新文件,请注意,库只能为当前/未来的日期转换提供正确答案。因此,如果您转换的是早期年份的日期,答案将反映当前的timezone规则,而不是过去的规则。目前库不支持历史timezone规则。
功能 另外两个DST计算功能也已更新,以反映美国/加拿大的新timezone规则。这些是boost::date_time::us_dst_rules和dst_calc_engine。虽然us_dst_rules已被正式弃用,但Graham Bennett提供了一个补丁,允许该类正确处理历史和未来日期。dst_calc_engine也已更新,可以处理历史和未来时间。这使得各种local_adjustor类能够正确工作。对于使用dst_calc_engine的自定义dst traits类的类,接口发生了一些更改。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中的示例。
Bug 修复 修复澳大利亚的DST traits(sf# 1672139),将DST结束时间设置为早上3:00而不是早上2:00。
Bug 修复 修复了由于I/O代码可能引起的链接错误问题。
Bug 修复 更改了greg_serialize.hpp和time_serialize.hpp中的序列化代码,以消除由于未使用变量(version和file_version)而产生的警告。感谢Caleb Epstein的补丁建议。
Bug 修复 修复了在FreeBSD上使用GCC且LANG环境变量设置为俄语时出现的回归错误——修改了解析器以使用经典locale而不是空locale。
Bug 修复 针对跟踪器问题1178092的更改——修改了convert_to_lower函数,使其local成为const static,以加快解析速度。
Bug 修复 Ulrich Eckhardt提供的补丁,以修复对EVC++ 4的支持。
功能 尽可能减少basic_stringstream的使用,以规避VC8标准库中的一个bug。有关更多信息,请参阅邮件列表存档

Boost 1.32至1.33(date_time 1.03至1.04)的更改

类型 描述
Bug 修复 当开始和结束点相同时,或者它们是连续的时,期间长度的计算不正确。纠正后的行为是,当结束点和开始点相等,或者创建的期间持续时间为零时,现在返回长度为零。开始点和结束点是连续的期间将返回长度为一。
Bug 修复 Time_input_facet缺少设置ISO格式的函数。它也无法解析不使用分隔符的时间值(%H%M%S)。这两个bug都已得到纠正。
功能 ptime_facet和ptime_input_facet的初步名称已更改为time_facet和time_input_facet。ptime_*版本已完全删除。
功能 from_iso_string函数无法解析小数位数。我们添加了代码,可以正确解析输入具有更多位数或位数过少的情况,这取决于编译时的库精度。仅包含小数点的ptime也能被正确解析。
Bug 修复 新的IO机制中的解析过程会在匹配到字符后消耗下一个字符。当尝试解析其开始点为特殊值的期间时,会出现此bug。
Bug 修复 新的IO系统未能提供用户“开启”流异常的能力。解析失败时,failbit也没有被设置。这两个问题都已得到修复。
Bug 修复 通过from_*_string函数解析特殊值的功能已修复。这也会影响库序列化特殊值的能力。Time_duration现在序列化为字符串或单独字段(取决于is_special())。
Bug 修复 先前,partial_date的输出流会将日期显示为一位数或两位数的整数(例如'1'或'12')。现已纠正为始终显示两位数整数(例如'01')。
功能 与本地时间管理相关的主要新功能。这包括引入一系列新类来表示时区和本地时间(有关完整详细信息,请参阅Date Time Local Time)。
功能 输入和输出facet已重写,以支持基于格式的格式重新定义(有关完整详细信息,请参阅Date Time IO)。
功能 添加了函数以方便在tm结构之间进行转换,用于dateptimetime_durationlocal_date_timeFILETIMEtime_tptime的转换函数也已提供。详情请参阅各个章节。
功能 已在microsec_time_clock中添加了一个universal_time函数(有关此函数的完整详细信息,请此处查阅)。
功能 添加了函数以方便在tm结构之间进行转换,用于dateptimetime_durationlocal_date_timeFILETIMEtime_tptime的转换函数也已提供。详情请参阅各个章节。
功能 已在microsec_time_clock中添加了一个universal_time函数(有关此函数的完整详细信息,请此处查阅)。
功能 当定义BOOST_HAS_THREADS时,Date-time现在在支持它的平台上使用可重入的POSIX函数。
Bug 修复 修复了序列化代码中的一个bug,在该bug中ptime、time_duration的特殊值(not-a-date-time、无穷大等)无法正确地从存档中读回。输出序列化代码写入了ptime_duration.seconds()等子字段,这些字段对特殊值无效,因此是未定义值。读回时,这些值可能导致奇怪的行为,包括构造时引发异常。
Bug 修复 修复了在各种平台/编译器下生成的多个警告。
Bug 修复 构造一个time_duration超出00:00至23:59:59.9...范围的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")。
Bug 修复 时间解析现在能正确处理小数秒过多的数字。前导零被丢弃("000100" -> 100 frac_sec),过多的数字会在正确的位置被截断("123456789876" -> 123456 或 123456789,取决于库编译时的精度)。
Bug 修复 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;
}
Bug 修复 已更新对已弃用的boost::tokenizer接口的使用,以适配当前接口。这修复了某些旧编译器上的编译错误。
Bug 修复 对旧IO系统中的模板化格式化程序进行了模板化,以接受char类型。还移除了对boost::lexical_cast的调用。

Boost 1.31至1.32(date_time 1.02至1.03)的更改

类型 描述
Bug 修复 修正了year_functor的月末跳转行为。以前,从2000年2月28日(闰年,非月末)开始,迭代到下一个闰年将得到2004年2月29日,而不是2004年2月28日。此行为已得到修正,产生正确结果2004年2月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对此更改的贡献。
功能 周期类现在能正确处理零长度和NULL周期。NULL周期是长度为负的周期。感谢Frank Wolf和Bart Garst对此更改的贡献。
功能 向gregorian::date添加了end_of_month函数,用于返回日期表示的当前月份的最后一天。对于not_a_date_time或infinity,结果未定义。
Bug 修复 移除了在整个库中不正确使用的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命名空间。请参阅Print Holidays Example
功能 添加了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对此更改的贡献。
Bug 修复 修复了duration_from_string()中的bug,该bug导致用小数位数不足的字符串格式化的time_duration构造不正确。使用微秒分辨率的时间间隔,字符串"1:01:01.010"创建的时间间隔为01:01:01.000010,而不是01:01:01.010000。
Bug 修复 修复了gregorian::date和posix_time::ptime在用min_date_time或max_date_time构造时的特殊值构造函数。这些构造函数构造了错误的值。

Boost 1.30至1.31(date_time 1.01至1.02)的更改

类型 描述
Bug 修复 构建配置已更新,以便使用MSVC编译器生成DLL、静态库和动态链接库文件。有关更多详细信息,请参阅Build/Compiler Information
Bug 修复 Time_duration from_string现在可以正确地从负值构造(例如“-0:39:00.000”)。代码由Bart Garst提供。
Bug 修复 修复了许多MSVC编译器在以警告级别4编译时产生的警告。
功能 为date和time迭代器添加了前缀递减运算符(--)。有关更多详细信息,请参阅Time IteratorsDate Iterators。代码由Bart Garst提供。
功能 为date_duration、time_duration和time类添加了Special_values功能。代码由Bart Garst提供。
Bug 修复 修复了time_duration_traits计算bug,该bug导致时间间隔被限制在32位范围内,即使64位可用。感谢Joe de Guzman对此的追踪。
Bug 修复 为持续时间类型(例如:date_duration、time_duration)提供了额外的运算符。这包括可被整数除以及对+=、-=运算符的修复。感谢Bart Garst编写此代码。此外,Calculations的文档也得到了改进。
Bug 修复 在boost::gregorian gregorian_types.hpp中为各种date_generator函数类添加了typedef。
功能 添加了from_time_t函数,用于将time_t转换为ptime。
功能 为合并周期的span函数添加了一个函数。请参阅date periodtime period文档。
功能 向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”。有关更多详细信息,请参阅Date Class
Bug 修复 各种文档修复。感谢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);

类型 描述
Bug 修复 添加了夏令时计算的新实验性功能。这允许基于traits规范DST规则。
功能 向gregorian日期类添加了计算儒略日和修正儒略日的新接口。请参阅boost::gregorian::date
功能 向boost::gregorian::date添加了计算ISO 8601周数的接口。请参阅boost::gregorian::date
功能 添加了ISO 8601时间日期格式(例如:YYYYMMDDTHHHMMSS)的解析函数。有关更多信息,请参阅Class ptime
功能 向period模板添加了一个length函数,因此date_periods和time_periods都将支持此函数。
Bug 修复 拆分了Jamfiles,以便libs/date_time/build/Jamfile只构建库,而libs/date_time/libs/test/Jamfile运行测试。
Bug 修复 修复了许多小的文档问题。
Bug 修复 移除了导致链接错误的DATE_TIME_INLINE宏。在使用该库的项目中,此宏不再需要。
Bug 修复 在gregorian_types.hpp中为year_iterator添加了缺失的typedef。
Bug 修复 修复了gregorian ostream运算符的一个问题,该问题阻止了宽流的使用。
Bug 修复 加强了日期的错误处理,因此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