获取 POSIX 纪元作为 system_clock::time_point
Posted
技术标签:
【中文标题】获取 POSIX 纪元作为 system_clock::time_point【英文标题】:Get POSIX epoch as system_clock::time_point 【发布时间】:2015-02-06 12:51:51 【问题描述】:我知道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)
会更聪明?
【问题讨论】:
【参考方案1】:标准未指定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_secondssys_days1970y/January/1.time_since_epoch()
是0s
。sys_secondssys_days2000y/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”。
【讨论】:
以上是关于获取 POSIX 纪元作为 system_clock::time_point的主要内容,如果未能解决你的问题,请参考以下文章
当碰到unix纪元问题时strtotime怎么转时间戳(DateTime类的使用方法)