c++ - 获取 POSIX 纪元作为 system_clock::time_point

标签 c++ time epoch c++-standard-library c++-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) 会更聪明吗?

最佳答案

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

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

  1. libc++
  2. libstdc++
  3. 对比

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

它们都是基于带符号的 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 Overview [time.clock.system.overview]

1 Objects of type system_clock represent wall clock time from the system-wide realtime clock. Objects of type sys_time<Duration> measure time since (and before) 1970-01-01 00:00:00 UTC excluding leap seconds. This measure is commonly referred to as Unix time. This measure facilitates an efficient mapping between sys_time and calendar types (26.8). [Example: sys_seconds{sys_days{1970y/January/1}}.time_since_epoch() is 0s. sys_seconds{sys_days{2000y/January/1}}.time_since_epoch() is 946’684’800s, which is 10’957 * 86’400s. —end example]

并且概要([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”。

关于c++ - 获取 POSIX 纪元作为 system_clock::time_point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27365236/

相关文章:

php - 日期格式 ISO 8601

impala - 将字符串中的纪元时间转换为 Impala SQL 中的日期字段

c++ - 从 C++ DLL 到 Matlab 的解析时间

C++ 迭代器与带有 length() 方法的对象

c++ - 强制 GCC 通知共享库中 undefined reference

c++ CopyFile函数问题

java - 如何检查 date 中的变量是否比当前日期早 10 秒

time - 如何在 Go 中获取给定月份的第一个星期一?

java - jackson :将时代反序列化为 LocalDate

c++ - 错误 : "Cygwin GCC" that is unsupported on this system