要为当前时间创建时间点,可以使用: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
(。如果需要,您也可以创建精度为milliseconds
的time_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_point
的system_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
和任意一个duration
。time_point
s和duration
s的逻辑代数在编译时为您检查。如果您需要覆盖闰秒,
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值可能会偏离它们。