获取 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()0ssys_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的主要内容,如果未能解决你的问题,请参考以下文章

如何从 postgres 获取时间戳作为 Unix 纪元?

bash文件将变量设置为纪元时间

当碰到unix纪元问题时strtotime怎么转时间戳(DateTime类的使用方法)

如何从 Perl 中的随机纪元时间戳获取纪元形式的月份开始?

获取表示当前日期的纪元时间戳范围

Pandas:使用 Unix 纪元时间戳作为日期时间索引