如何从 Unix 纪元以来的毫秒数创建时间点?

How to create a time point from milliseconds since Unix epoch?

为当前时间创建时间点,可以使用:std::chrono::system_clock::now().

但是,我不知道如何创建自 UNIX 纪元以来给定毫秒数的时间点?

此外,std::chrono::time_point 甚至是推荐的及时表示“瞬间”的方法吗?或者应该优先选择 std::time_t

auto ms_since_epoch(std::int64_t m){
  return std::chrono::system_clock::from_time_t(time_t{0})+std::chrono::milliseconds(m);
}

这个returns一个系统时钟时间点。

像大多数 calendar/time 相关的东西一样,它正确涵盖闰秒之类的东西的可能性很低;几率是你的 ms,因为 unix 纪元值可能会被他们关闭,例如。

这是easier/simpler:

std::chrono::system_clock::time_point tp{std::chrono::milliseconds{m}};

以上精度为 system_clock::precision(macOS 上 microseconds,Linux 系统上 nanoseconds,[=1/10 microseconds 84=]).如果需要,您还可以创建精度为 millisecondstime_point

std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
    tp{std::chrono::milliseconds{m}};

在 C++20 中,这可以简化为:

std::chrono::sys_time tp{std::chrono::milliseconds{m}};

sys_time 只是 time_pointsystem_clock 系列的任何精度的模板类型别名。 IE。以上是与之前创建的 milliseconds 精度 time_point 完全相同的类型。

Also, is std::chrono::time_point even the recommended way to represent "instants" in time? Or should std::time_t be preferred?

我推荐 std::chrono::system_clock::time_point 而不是 std::time_t:

    基于system_clock
  • time_point有一个明确定义的纪元(在C++20中),这也是C++17中的事实标准: 它计算自 1970-01-01 00::00:00 UTC 以来的时间,不包括闰秒。这也称为 Unix Time. In contrast no C or C++ standard specifies the epoch of time_t, though using Unix Time 是常见的做法,并由 POSIX 指定。

  • 虽然未指定,但 time_t 通常具有 seconds 的精度。 system_clock::time_point 通常具有比这更精细的数百万或数十亿的精度。没有指定确切的精度,但它记录在 API 中,因此您可以在编译时或 运行 时发现它。 system_clock::periodstd::ratiosystem_clock::time_point::period 相同,表示从一个刻度到下一个刻度的编译时秒数。

  • time_t 通常只是一个 32 或 64 位带符号整数。这在通用代码中没有类型安全。例如,您可以添加两个 time_t 并进行编译。然而,添加两个时间点是不合逻辑的(而减去它们是)。 chrono 库在编译时捕获此类逻辑错误。添加两个 time_point 不会编译。但是您可以添加 time_point 和任何 durationtime_points 和 durations 的逻辑代数在编译时为您检查。

  • 如果您需要涵盖闰秒,time_t 不指定但很常见(通常是 Unix Time). With system_clock, Unix Time is specified (you know you aren't counting leap seconds). However in C++20 there is another chrono clock that does include leap seconds in its count: std::chrono::utc_clock. Like all chrono clocks this clock has it's own type-safe family of time_points, with its own convenience template type alias called utc_time<Duration>. And you can convert between them using std::chrono::clock_cast.

像这样:

auto tp_sys = clock_cast<system_clock>(tp_utc);