获取POSIX epoch as system_clock :: time_point

时间:2014-12-08 19:17:30

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

我知道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 个答案:

答案 0 :(得分:8)

标准使std::chrono::system_clock::time_point的时代不明确。

我知道有三种std::chrono::system_clock::time_point实现:

  1. 的libc ++
  2. 的libstdc ++
  3. VS
  4. 所有这三个都是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()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>;
    

    我们希望&#34; a&#34; in&#34; C ++ 2a&#34;将是&#34; 0&#34;。