我知道 std::chrono::system_clock::time_point
的默认值是时钟的纪元,但我在 C++11 标准中找不到任何规定system_clock
的纪元与 POSIX 纪元 (1970-01-01T00:00:00Z) 相同。在 Linux 和 Windows 上假设是这种情况是否安全?或者使用 std::chrono::system_clock::from_time_t(0)
会更聪明吗?
最佳答案
标准离开std::chrono::system_clock::time_point
的纪元未指定。
std::chrono::system_clock::time_point
的三种实现方式我知道:
- libc++
- libstdc++
- 对比
所有这三个都是 Unix Time 的薄包装,计算自 1970 年 1 月 1 日星期四协调世界时 (UTC) 00:00:00 以来经过的秒数,不计算闰秒。
它们都是基于带符号的 64 位整数类型。没有一个是稳定的。 libc++ 的滴答周期为微秒。 libstdc++的滴答周期为纳秒,VS的滴答周期为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 Overview [time.clock.system.overview]
1 Objects of type
system_clock
represent wall clock time from the system-wide realtime clock. Objects of typesys_time<Duration>
measure time since (and before) 1970-01-01 00:00:00 UTC excluding leap seconds. This measure is commonly referred to as Unix time. This measure facilitates an efficient mapping betweensys_time
and calendar types (26.8). [Example:sys_seconds{sys_days{1970y/January/1}}.time_since_epoch()
is0s
.sys_seconds{sys_days{2000y/January/1}}.time_since_epoch()
is946’684’800s
, which is10’957 * 86’400s
. —end example]
并且概要([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”。
关于c++ - 获取 POSIX 纪元作为 system_clock::time_point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27365236/