时间点 -- 持续时间 -- 间隔(周期) -- 特殊值处理
本节介绍一些可以对时间点执行的基本算术规则。一般来说,时间点支持与持续时间结合的基本算术运算,如下所示
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(∞)
类别 | 描述 |
---|---|
功能 | |
接口 | 提供用于操作日期和时间的具体类 |
| |
计算 | 为执行高效的时间计算提供基础 |
| |
表示灵活性 | 提供最大的可重用性和灵活性 |
| |
日期计算 | 提供日期计算工具 |
| |
时间计算 | 提供用于操作时间的具体类 |
| |
时钟接口 | 提供用于检索当前时间的类 |
| |
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,使得
ti 是我们“发现”xi 是否是 T 的成员的时间。现在我们可以定义三种时间类型类别
如果对于所有 xi,ti = 负无穷大,我们说类型 T 是 可预测的。
如果对于某些 xi,ti = 正无穷大,我们说类型 T 是 形式错误的。
否则,我们说类型 T 是 不可预测的(这意味着对于某些 xi,ti 是有限的)。
形式错误的集合没有太大的实际用途,因此我们不再进一步讨论它们。用简单的英语来说,以上只是说可预测类型的所有值都是提前已知的,但不可预测类型的某些值在某个特定时间之前是未知的。
可预测类型具有两个重要的属性
这在实践中的效果是,持续时间计算可以使用简单的整数减法来实现。可预测类型的示例包括 TAI 时间点和公历日期。
不可预测类型具有完全相反的属性
不可预测类型的示例包括 UTC 时间点和本地时间时间点。
我们可以稍微改进一下,说不可预测类型中的范围可以是可预测的,并且完全在该范围内对值执行的操作将是稳定的。例如,从 1970-01-01 到现在的 UTC 时间点范围是可预测的,因此该范围内持续时间的计算将是稳定的。
这些限制是有问题的,因为重要的时间类型(如 UTC 和本地时间)实际上是不可预测的,因此对它们的操作有时是不稳定的。然而,在实践中,我们经常想要执行这种操作,例如计算以本地时间指定的未来两个时间点之间的持续时间。
库能做的最好的事情是提供近似值,这通常是可能的,并且对于大多数目的来说已经足够好了。当然,文档必须指定答案何时是近似值(因此是不稳定的)以及误差可能有多大。在许多方面,使用不可预测的集合进行计算类似于浮点数的使用,对于浮点数,结果预计仅是近似正确的。然后,使用可预测的集合进行计算将类似于整数的用户,其中结果预计是精确的。
对于需要精确答案或不能容忍不稳定性的情况,用户必须能够指定这一点,然后如果用户请求无法获得精确、稳定答案的计算,则库应抛出异常。
以下是与日期时间领域相关的许多术语。
时间类型分类
以及其他一些术语
一些标准日期时间术语
更多实验性术语
这些是设计类型的术语
该库的设计目前正在使用 Wiki 和电子邮件讨论进行演变。您可以在以下位置找到更多信息:Boost Wiki GDTL 起始页。
概述 -- 编译选项 -- 编译器/可移植性说明 -- 目录结构 -- 所需的 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
。
另一个便利之处是 date
和 ptime
的默认构造函数。默认情况下启用这些构造函数。要禁用它们,只需在您的项目文件中定义 DATE_TIME_NO_DEFAULT_CONSTRUCTOR
。
Boost Date-Time 库已使用许多编译器和平台构建和测试。但是,某些编译器和标准库存在问题。虽然可以解决其中一些问题,但其他问题很难解决。已知以下编译器完全支持该库的所有方面
不幸的是,VC8 编译器在日期时间代码方面存在一些问题。最严重的问题是内存泄漏,该泄漏已引入 VC8 标准库 basic_stream 代码中。日期时间代码已更改为尽可能避免这种情况,但如果您使用旧版 IO 选项(VC8 的非默认选项),则问题仍然可能出现。有关更多详细信息,请参见邮件列表存档。
除了上述问题外,某些版本的 VC8 库还将 std::tm
结构中允许的值范围限制为正值。这是 VC8 中添加的新限制。其影响是 1900 年之前的日期将导致异常。不幸的是,这个问题没有简单的解决方法。请注意,新 64 位版本的 VC8 编译器似乎没有此限制。
这些编译器支持该库的所有方面,除了 wstring/wstream
输出。
特别是,缺乏对标准区域设置的支持限制了库支持基于 iostream 的输入输出的能力。对于这些编译器,提供了一组更有限的基于字符串的输入输出。具有此限制的一些编译器/标准库包括
现在已放弃对某些旧编译器的官方支持。这包括
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...)
date-time 的各个部分依赖于其他 boost 库。这些包括
因此需要安装这些库。
该库在
libs/date_time/test libs/date_time/test/gregorian libs/date_time/test/posix_time libs/date_time/test/local_time
目录中提供了大量测试。构建和执行这些测试可确保安装正确且库运行正常。此外,这些测试有助于移植到新的编译器。最后,这些测试提供了许多用法示例中未明确描述的函数的示例。
类型 | 描述 |
---|---|
错误修复 | 修复 constrained_value::assign 为 constexpr,以便 ptime 和日期构造为 constexpr。参见:pull 161 和 pull 161。 |
错误修复 | 在 Clang 上抑制 MSVC CRT 弃用。参见:pull 160。 |
类型 | 描述 |
---|---|
增强 | 使 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 #125 和 github issue #116 |
类型 | 描述 |
---|---|
错误修复 | 格式说明符“%T”和“%R”现在由库而不是底层标准方面处理。这修复了方面不支持占位符的情况(#3876)。 |
类型 | 描述 |
---|---|
更改 | 时间持续时间的默认格式现在为“%-%O:%M:%S%F”,而不是之前使用的“%-%H:%M:%S%F”。为了保留旧的行为,必须在时间 IO 方面构造期间显式指定格式字符串(#1861)。 |
错误修复 | 格里高利日期现在在 64 位平台上内部使用 32 位整数类型(#3308)。 |
错误修复 | 调整了 UTC 时区偏移边界,以便允许高达 +14 小时的偏移量(#2213)。 |
类型 | 描述 |
---|---|
功能 | 添加了对格式化和读取超过 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)。 |
类型 | 描述 |
---|---|
功能 | 更新了 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 标准库中的一个错误。 请参阅 邮件列表存档 以获取更多信息。 |
类型 | 描述 |
---|---|
错误修复 | 当起始点和结束点相同或连续时,期间长度的计算不正确。 现在已更正此行为,当结束点和起始点相等时,或创建持续时间为零的期间时,将返回长度零。 起始点和结束点连续的期间将返回长度一。 |
错误修复 | 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)。 |
功能 | 添加了函数以方便 date 、ptime 、time_duration 和 local_date_time 的 tm 结构之间的转换。 还提供了用于将 FILETIME 和 time_t 转换为 ptime 的函数。 有关详细信息,请参阅各个部分。 |
功能 | 在 microsec_time_clock 中添加了 universal_time 函数(此函数的完整详细信息可以在此处找到)。 |
功能 | 添加了函数以方便 date 、ptime 、time_duration 和 local_date_time 的 tm 结构之间的转换。 还提供了用于将 FILETIME 和 time_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 的调用。 |
类型 | 描述 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
错误修复 | 更正了 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 宏的不正确用法。 | ||||||||||||||||||
功能 | 为某些日期类添加了新名称。 原始名称仍然有效,但将来可能会被弃用。 更改如下:
|
||||||||||||||||||
功能 | 为日期生成器添加了自由函数。 函数包括: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 的特殊值构造函数。 为这些构造了错误的值。 |
类型 | 描述 |
---|---|
错误修复 | 更新了构建配置,以便现在使用 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 的更新。 |
注意: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。