Boost C++ 库

……是世界上备受推崇且设计精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu《C++ 编码标准》

第 10 章 Boost.Date_Time - Boost C++ 函数库
PrevUpHomeNext

第 10 章 Boost.Date_Time

Jeff Garland

受 Boost Software License, Version 1.0 的约束。(请参阅随附文件 LICENSE_1_0.txt 或复制自 https://boost.ac.cn/LICENSE_1_0.txt

引言

一组基于泛型编程概念的日期时间库。

本文档也可提供 PDF 格式。您可以在以下位置找到它:

http://www.crystalclearsoftware.com/libraries/date_time/date_time.pdf

此外,完整的 Doxygen 参考文档可以在以下位置找到:

http://www.crystalclearsoftware.com/libraries/date_time/ref_guide/index.html

最新版本的文档可以在以下位置找到:

http://www.crystalclearsoftware.com/libraries/date_time/index.html

概念

动机

创建此库的动机源于在多个项目中使用和帮助构建多个日期时间库的经验。日期时间库为大多数开发项目提供了基础架构。然而,它们在计算、格式化、转换或执行某些其他功能的能力方面大多存在局限性。例如,大多数库无法正确处理闰秒、提供无穷大等概念,或者无法使用高分辨率或网络时间源。这些库在表示日期和时间方面也往往很僵化。因此,不可能为项目或子项目定制策略。

日期和时间的编程应该和字符串和整数的编程一样简单自然。通过拥有一套强大的运算符和计算能力,可以极大地简化包含大量时间逻辑的应用程序。类应该能够比较日期和时间、添加时长或时间长度、从时钟检索日期和时间,以及自然地处理日期和时间间隔。

开发该库的另一个动机是将现代 C++ 库设计技术应用于日期时间领域。实际上是为构建时间类型构建一个框架。例如,通过提供迭代器和特征类来控制库的基本属性。据作者所知,该库是唯一一个认真尝试将现代 C++ 应用于日期时间库的项目。

领域概念

日期时间领域充斥着术语和问题。以下是对您将在库中找到的概念的简要介绍。

该库支持 3 种基本时间类型

  • 时间点 (Time Point) -- 时间连续体中位置的指定符。
  • 时间时长 (Time Duration) -- 未附加到时间连续体上任何点的时间长度。
  • 时间间隔 (Time Interval) -- 附加到时间连续体特定点上的时间长度。也称为时间周期。

这些时间类型中的每一种都有一个由可表示的最短持续时间定义的分辨率。一个时间系统 (Time System) 提供所有这些类别的时态类型以及标记和计算时间点所依据的规则。日历系统 (Calendar Systems) 只是分辨率最大为一天的时间系统。当今最广泛使用的日历系统是公历 (Gregorian)(ISO 系统基本上是它的派生)。但是,还有许多其他的日历系统。UTC (协调世界时) 是一个广泛使用的民用时间系统。UTC 通过使用闰秒(这不可预测,仅在必要时)来调整地球在经度 0 处的自转。大多数本地时间 (local time) 系统都基于 UTC,但也根据地球自转进行调整,以使各地白天的日照时间相似。此外,一些本地时间还包括夏令时 (daylight savings time, DST) 调整,以在夏季更改日照时间。

时钟设备 (Clock Device) 是一个软件组件(与某些硬件相关联),它提供相对于时间系统的当前日期或时间。时钟可以测量当前时间,其分辨率可能高于或低于特定时间表示。

该库提供了计算日期和时间的支持。然而,时间计算与整数计算不完全相同。如果您认真对待时间计算的准确性,则需要阅读关于稳定性、可预测性和近似值的内容。

设计概念

该库的很大一部分起源是观察到很少有日期时间库的设计能够允许定制和扩展。一个典型的例子是,日历逻辑直接内置到日期类中。或者时钟检索函数直接内置到时间类中。这些设计决策通常使得无法扩展或更改库的行为。更根本地说,通常会假设时间表示的分辨率或公历。

结果往往是,项目由于需要高分辨率时间表示或其他与库实现不匹配的假设,而只能接受一个不那么完整的库。这是非常不幸的,因为开发这样的库是一项艰巨的任务。

尽管设计远非完美,但当前的设计比作者所知的任何日期时间库都要灵活得多。预计在未来的版本中,各种可扩展性方面的内容将得到更好的文档记录。有关库设计目标的信息在此处进行了总结


PrevUpHomeNext