【问题标题】:Get POSIX epoch as system_clock::time_point获取 POSIX 纪元作为 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) 会更聪明?

【问题讨论】:

    标签: c++ time epoch c++-standard-library chrono


    【解决方案1】:

    标准未指定std::chrono::system_clock::time_point 的纪元。

    我知道std::chrono::system_clock::time_point 的三种实现方式:

    1. libc++
    2. libstdc++
    3. 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()0ssys_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”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 2013-05-07
      相关资源
      最近更新 更多