标准未指定std::chrono::system_clock::time_point 的纪元。
我知道std::chrono::system_clock::time_point 的三种实现方式:
- libc++
- libstdc++
- VS
所有这三个都是 Unix Time 周围的薄包装,它计算自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的秒数,不计算闰秒。
它们都基于有符号的 64 位整数类型。他们都不是稳定的。 libc++ 有一个微秒的滴答周期。 libstdc++的tick周期为纳秒,VS的tick周期为0.1微秒。
如果有用,here is a paper 演示了一些公式来利用未指定但常见的纪元来从民用日历来回转换,而无需通过 time_t。
使用std::chrono::system_clock::from_time_t 的好处是可以保证按标准工作。缺点是在实践中它会将您限制为一秒的精度(尽管该精度未指定)。
假设std::chrono::system_clock 的纪元为 1970-01-01,即使未指定,其优势在于您将在所有已知实现上都是正确的,并且此替代方案的可用精度远高于此由time_t提供。
更新
C++2a 规范草案现在将 system_clock 指定为模型 Unix Time:
26.7.1.1 概述 [time.clock.system.overview]
1 system_clock 类型的对象表示来自系统范围实时时钟的挂钟时间。 sys_time<Duration> 类型的对象测量自 1970-01-01 00:00:00 UTC 以来(和之前)的时间,不包括闰秒。这种度量通常称为Unix 时间。此措施有助于在 sys_time 和日历类型 (26.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。
—结束示例]
而且概要([time.syn])之前已经定义了:
template<class Duration>
using sys_time = time_point<system_clock, Duration>;
using sys_seconds = sys_time<seconds>;
using sys_days = sys_time<days>;
我们希望“C++2a”中的“a”为“0”。