获取POSIX epoch as system_clock :: time_point

Mat*_*ine 9 c++ time epoch c++-standard-library c++-chrono

我知道a的默认值std::chrono::system_clock::time_point是时钟的纪元,但是我在C++ 11标准中找不到任何system_clock与epix纪元相同的命令(1970-01-01T00:00: 00Z).在Linux和Windows上假设这种情况是否安全?或者使用它会更聪明std::chrono::system_clock::from_time_t(0)吗?

How*_*ant 10

该标准留下了std::chrono::system_clock::time_point未指明的时代.

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

  1. 的libc ++
  2. 的libstdc ++
  3. VS

所有这三个都是Unix时间周围的瘦包装器,它计算自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数,不计算闰秒.

所有这些都基于带符号的64位整数类型.他们都没有稳定.libc ++的滴答周期为微秒.libstdc ++的滴答周期为纳秒,VS的滴答周期为0.1微秒.

如果它是有用的,这里有一篇论文,它展示了一些公式,以利用未指明的但共同的时代从民事日历中来回转换而不经过time_t.

使用的优点std::chrono::system_clock::from_time_t是保证按标准工作.缺点是在实践中它会限制你的精度一秒钟(虽然没有指定精度).

假设std::chrono::system_clock时间为1970-01-01,即使它没有说明,在所有已知的实现中你都是正确的,并且这种替代的可用精度远远高于time_t.


更新

C++ 2a规范草案现在指定system_clock模拟Unix时间:

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>;
Run Code Online (Sandbox Code Playgroud)

我们希望"C++ 2a"中的"a"为"0".