C++11中的时间库有三个基本概念:
Duration:表示两个时刻的度量,如时、分、秒都是duration。duration内部是通过count和计量精度(period precision)来衡量duration,其中period precision表示成秒的倍率值(ratio)。
Time point:表达某一特定的时刻点,但实际上,绝对的时刻点是不存在的,因此time point也是由duration来表达的,它是机器上的clock相对于epoch的duration。
Clock:用time point来表达现实(机器)中的时刻。
C++11库中有三种clock:system_clock(日历时钟,可被手工调整), steady_clock(稳定增长的时钟,由机器tick计算而来)和high_resolution_clock(由具体实现确定,可能是system_clock或steady_clock)。
C++20将clock概念进行了规范化。
template<class T>
requires {
typename T::rep;
typename T::period;
typename T::duration;
typename T::time_point;
T::is_steady;
T::now();
}
满足上面条件的T就可以称为”clock”。另外,还有一个TrivialClock的概念,即在满足clock要求的基础上,还要求:
- 类型TC::rep, TC::duration, and TC::time_point 满足EqualityComparable, LessThanComparable, DefaultConstructible, CopyConstructible, CopyAssignable, Destructible和NumericType.
- 类型TC::rep, TC::duration, and TC::time_point的左值是可交换的(Swappable)
- TC::now()函数为throw exceptions
- 类型TC::time_point::clock也递归地满足TrivialClock要求
C++20增加了几个clock类:
- utc_clock:表示协调世界时,人为“协调”(闰秒),从00:00:00, 1 January 1970开始
- tai_clock:表示国际原子时,恒定时间,从00:00:00, 1 January 1958开始。
- gps_clock:表示GPS时间,没有闰秒,从00:00:00, 6 January 1980开始
- file_clock:用于文件系统,它的epoch未指定。
- local_t:表示本地(虚拟)时间,未指定时区。
关于UTC,TAI,GPS时间的背景知识,可查阅相关文档。
除local_t外,上面的类都满足clock要求,并且std::chrono::system_clock、std::chrono::steady_clock、std::chrono::high_resolution_clock、std::filesystem::file_time_type::clock、std::chrono::file_clock满足TrivialClock要求。
C++20增加了另外三个概念:
- time of day:一天内的时、分、秒,即从午夜开始的durantion。
- Calendar:与日历相关的年、月、日、周。
- time-zone:与地理相关的时区,基础信息来源于Time Zone Database。
【目前的gcc10.2还未支持这部分扩展,就没有示例了,以后进行补充。】