时间点 -- 持续时间 -- 区间(周期) -- 特殊值处理
本节介绍时间点可以执行的一些基本算术规则。通常,时间点与持续时间结合使用时支持基本算术,如下所示:
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 = negative infinity,则我们称类型 T 是可预测的。
如果对于某些 xi,ti = positive infinity,则我们称类型 T 是格式不正确。
否则,我们称类型 T 是不可预测的(这意味着对于某些 xi,ti是有限的)。
格式不正确的集合没有实际用途,因此我们不再讨论它们。通俗地说,上面的意思只是一个可预测类型的所有值都是提前已知的,但一个不可预测类型的一些值要到某个特定时间才会被知道。
可预测的类型具有几个重要属性:
其实际效果是,持续时间计算可以通过简单的整数减法来实现。可预测类型的示例如 TAI 时间点和公历日期。
不可预测的类型具有完全相反的属性:
不可预测类型的示例如 UTC 时间点和本地时间时间点。
我们可以稍微细化一下,说一个不可预测类型中的一个范围可以是可预测的,并且在那个范围内的值上执行的操作将是稳定的。例如,从 1970-01-01 到现在的 UTC 时间点范围是可预测的,因此在该范围内的持续时间计算将是稳定的。
这些限制存在问题,因为像 UTC 和本地时间这样重要的时间类型实际上是不可预测的,因此对它们进行的操作有时是不稳定的。然而,作为实际情况,我们经常希望执行这类操作,例如计算未来两个以本地时间指定的时间点之间的持续时间。
库所能做的最好的是提供一个近似值,这通常是可能的,并且对于大多数目的来说已经足够了。当然,文档必须说明答案何时是近似的(因此不稳定)以及误差可能有多大。在许多方面,使用不可预测集合进行计算类似于使用浮点数,其中结果预计只能近似正确。使用可预测集合进行计算则类似于使用整数,其中结果预计是精确的。
对于需要精确答案或无法容忍不稳定性这种情况,用户必须能够指定这一点,然后如果用户请求一个无法获得精确、稳定答案的计算,库应抛出异常。
以下是一些与日期时间域相关的术语:
时间类型的分类
以及其他一些术语:
一些标准的日期时间术语
一些更具实验性的
这些是设计方面的术语
该库的设计目前正在通过 Wiki 和电子邮件讨论进行演变。您可以在以下位置找到更多信息:Boost Wiki GDTL 首页。
概述 -- 编译选项 -- 编译器/可移植性说明 -- 目录结构 -- 所需的 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。
另一个便利是date和ptime的默认构造函数。默认情况下启用这些构造函数。要禁用它们,只需在项目文件中定义DATE_TIME_NO_DEFAULT_CONSTRUCTOR。
Boost Date-Time 库已在许多编译器和平台上进行了构建和测试。但是,一些编译器和标准库存在问题。虽然其中一些问题可以解决,但另一些问题则难以解决。以下编译器被认为完全支持该库的所有方面:
不幸的是,VC8 编译器在日期时间代码方面存在一些问题。最严重的问题是 VC8 标准库 basic_stream 代码中引入的内存泄漏。Date-time 代码已进行了修改以尽可能避免此问题,但如果您使用的是旧版 IO 选项(VC8 上的非默认选项),则问题仍然可能出现。有关更多详细信息,请参阅邮件列表存档。
除了上述问题外,VC8 库的某些版本还限制了std::tm结构中允许值的范围为正值。这是 VC8 中新增的限制。效果是 1900 年之前的日期将导致异常。不幸的是,这个问题没有简单的解决方法。请注意,VC8 的新 64 位版本似乎没有此限制。
这些编译器支持该库的所有方面,但不支持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 涉及在 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...)
date-time 的各个部分依赖于其他 boost 库。这些包括:
因此,需要安装这些库。
该库在
libs/date_time/test
libs/date_time/test/gregorian
libs/date_time/test/posix_time
libs/date_time/test/local_time
目录中提供了大量测试。构建和执行这些测试可确保安装正确且库运行正常。此外,这些测试有助于移植到新编译器。最后,测试提供了许多未在用法示例中明确描述的函数的示例。
| 类型 | 描述 |
|---|---|
| Bug 修复 | 将 constrained_value::assign 设置为 constexpr,以便 ptime 和 date 构造为 constexpr。请参阅:pull 161 和 pull 161。 |
| Bug 修复 | 在 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)。 |
| Bug 修复 | gettimeofday、day_number 和 from_iso_extended_string 的文档澄清。 github issue #127 github issue #125 和 github issue #116 |
| 类型 | 描述 |
|---|---|
| Bug 修复 | 现在由库而不是底层标准区域处理 "%T" 和 "%R" 格式说明符。这修复了占位符不受区域支持的情况 (#3876)。 |
| 类型 | 描述 |
|---|---|
| 更改 | 时间间隔的默认格式现为“%-%O:%M:%S%F”,而不是先前使用的“%-%H:%M:%S%F”。为了保留旧的行为,必须在时间IO facet构造时显式指定格式字符串(#1861)。 |
| Bug 修复 | 在64位平台上,公历日期现在内部使用32位整数类型(#3308)。 |
| Bug 修复 | 调整了UTC时区偏移边界,允许偏移量高达+14小时(#2213)。 |
| 类型 | 描述 |
|---|---|
| 功能 | 添加了对格式化和读取超过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)。 |
| 类型 | 描述 |
|---|---|
| 功能 | 更新了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。有关更多信息,请参阅邮件列表存档。 |
| 类型 | 描述 |
|---|---|
| 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结构之间进行转换,用于date、ptime、time_duration和local_date_time。FILETIME和time_t到ptime的转换函数也已提供。详情请参阅各个章节。 |
| 功能 | 已在microsec_time_clock中添加了一个universal_time函数(有关此函数的完整详细信息,请此处查阅)。 |
| 功能 | 添加了函数以方便在tm结构之间进行转换,用于date、ptime、time_duration和local_date_time。FILETIME和time_t到ptime的转换函数也已提供。详情请参阅各个章节。 |
| 功能 | 已在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的调用。 |
| 类型 | 描述 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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宏。 | ||||||||||||||||||
| 功能 | 为一些日期类添加了新名称。原始名称仍然有效,但将来可能会被弃用。更改包括:
|
||||||||||||||||||
| 功能 | 添加了用于日期生成器的免费函数。函数包括: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构造时的特殊值构造函数。这些构造函数构造了错误的值。 |
| 类型 | 描述 |
|---|---|
| Bug 修复 | 构建配置已更新,以便使用MSVC编译器生成DLL、静态库和动态链接库文件。有关更多详细信息,请参阅Build/Compiler Information。 |
| Bug 修复 | Time_duration from_string现在可以正确地从负值构造(例如“-0:39:00.000”)。代码由Bart Garst提供。 |
| Bug 修复 | 修复了许多MSVC编译器在以警告级别4编译时产生的警告。 |
| 功能 | 为date和time迭代器添加了前缀递减运算符(--)。有关更多详细信息,请参阅Time Iterators和Date 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 period和time 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的更新。 |
注意: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。