它既是 time_point 所指的特定 clock 的函数,也是 clock 的实现。该标准规定了三种不同的时钟:
system_clock
steady_clock
high_resolution_clock
而且标准没有指定这些时钟的纪元。
程序员(你)也可以编写他们自己的时钟,这可能会也可能不会指定一个纪元。
有一个事实上的(非官方的)标准,std::chrono::system_clock::time_point 的纪元与Unix Time 一致。这被定义为自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的持续时间,不包括闰秒。
Fwiw,here is a date/time library,它利用了这一事实标准。
其他两个标准指定的时钟没有事实上的标准。此外,high_resolution_clock 可以作为system_clock 或steady_clock 的类型别名。
在 OS X 上,high_resolution_clock 是 steady_clock 的类型别名,steady_clock 是计算机启动后的纳秒计数(与 UTC 没有任何关系)。
更新
C++2a 规范草案现在说 system_clock:
sys_time<Duration> 类型的对象测量自(和之前)以来的时间
1970-01-01 00:00:00 UTC 不包括闰秒。这个措施是
通常称为 Unix 时间。这项措施有利于
sys_time 和日历类型 (27.8) 之间的有效映射。
[例子:
sys_seconds{sys_days{1970y/January/1}}.time_since_epoch() 是 0s。
sys_seconds{sys_days{2000y/January/1}}.time_since_epoch() 是
946’684’800s,即10’957 * 86’400s。 —结束示例]
此外,C++2a 还引入了utc_clock、tai_clock、gps_clock 和file_clock。这些时钟也有明确定义的纪元,因为可以clock_casttime_points 从一个时钟到另一个时钟,system_clock。
file_clock 纪元将不可移植,但您仍然可以将其 time_points 与民用日历相关联。
utc_clock 类似于system_clock,只是它不忽略闰秒。例如:
#include <chrono>
#include <iostream>
int
main()
{
using namespace std::chrono;
auto s1 = sys_days{December/31/2016} + 23h + 59min + 59s;
auto s2 = sys_days{January/1/2017};
auto u1 = clock_cast<utc_clock>(s1);
auto u2 = clock_cast<utc_clock>(s2);
std::cout << s2 - s1 << '\n';
std::cout << u2 - u1 << '\n';
}
输出:
1s
2s
更新
链接到现在指定的 (C++20) system_clock 纪元:http://eel.is/c++draft/time.clock.system#overview-1
system_clock 类型的对象表示从
系统范围的实时时钟。 sys_time<Duration> 类型的对象
测量自 1970-01-01 00:00:00 UTC 以来的时间,不包括闰秒。
这种度量通常称为Unix 时间。这项措施
促进sys_time 和日历之间的有效映射
类型([time.cal])。 [ 例子:
sys_seconds{sys_days{1970y/January/1}}.time_since_epoch() 是
0s。 sys_seconds{sys_days{2000y/January/1}}.time_since_epoch()
是946'684'800s,也就是10'957 * 86'400s。
——结束示例 ]