我知道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)
会更聪明吗?
答案 0 :(得分:8)
标准使std::chrono::system_clock::time_point
的时代不明确。
我知道有三种std::chrono::system_clock::time_point
实现:
所有这三个都是Unix Time周围的瘦包装,它计算自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数,不计算闰秒。
所有这些都基于带符号的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概述[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>;
我们希望&#34; a&#34; in&#34; C ++ 2a&#34;将是&#34; 0&#34;。