如何从Unix epoch开始以毫秒为单位创建时间点



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

然而,我不知道如何创建一个自UNIX纪元以来给定毫秒的时间点?

此外,std::chrono::time_point甚至是表示";瞬间;及时还是应该首选std::time_t

这更容易/更简单:

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

上面的精度为system_clock::precision(在macOS上为microseconds,在Linux系统上为nanoseconds,在Windows上为1/10microseconds(。如果需要,您也可以创建精度为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族的模板类型别名。即,上述类型与之前创建的milliseconds精度time_point完全相同。

此外,std::chrono::time_point甚至是表示";瞬间;及时还是应该首选std::time_t?

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

  • time_point基于system_clock有一个定义明确的历元(在C++20中(,这也是C++17中事实上的标准:它计算自1970-01-01 00::00:00 UTC以来的时间,不包括闰秒。这也被称为Unix时间。相比之下,没有C或C++标准指定time_t的epoch,尽管使用Unix时间是常见的做法,并且由POSIX指定。

  • 尽管未指定,但time_t通常具有seconds的精度。CCD_ 22通常具有比其精细数百万或数十亿的精度。没有指定确切的精度,但它在API中有文档记录,因此您可以在编译时或运行时发现它。CCD_ 23是与CCD_ 25相同的CCD_。

  • CCD_ 26通常只是一个32或64位有符号积分。这在泛型代码中没有类型安全性。例如,您可以添加两个time_t,它就会编译。然而,将两个时间点相加是不合乎逻辑的(而减去它们是合乎逻辑的(。chrono库在编译时捕获这样的逻辑错误。添加两个time_point不会编译。但是您可以添加一个time_point和任意一个durationtime_points和durations的逻辑代数在编译时为您检查。

  • 如果您需要覆盖闰秒,time_t不覆盖闰秒是未指定的,但很常见(通常是Unix时间(。使用system_clock,可以指定Unix时间(您知道不计算闰秒(。然而,在C++20中,还有另一个在计数中包含闰秒的计时时钟:std::chrono::utc_clock。与所有计时时钟一样,这款时钟有自己的类型安全的time_point系列,并有自己的方便模板类型别名utc_time<Duration>。您可以使用std::chrono::clock_cast在它们之间进行转换。

如下:

auto tp_sys = clock_cast<system_clock>(tp_utc);
auto ms_since_epoch(std::int64_t m){
return std::chrono::system_clock::from_time_t(time_t{0})+std::chrono::milliseconds(m);
}

这将返回系统时钟时间点。

像大多数与日历/时间相关的事情一样,这类事情正确涵盖闰秒的几率很低;例如,几率是ms,因为unix epoch值可能会偏离它们。

最新更新