要创建当前时间的时间点,可以使用:std::chrono::system_clock::now()
。
然而,我无法弄清楚如何根据自UNIX纪元以来的毫秒数创建时间点?
另外,std::chrono::time_point
是否是表示时间“瞬间”的推荐方式?还是应该优先选择std::time_t
?
要创建当前时间的时间点,可以使用: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/10 microseconds
)。如果需要,还可以创建精度为 milliseconds
的 time_point
。std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
tp{std::chrono::milliseconds{m}};
std::chrono::sys_time tp{std::chrono::milliseconds{m}};
sys_time
只是一个模板类型别名,代表了任意精度的system_clock
时间点。即上述类型与之前创建的milliseconds
精度的time_point
完全相同。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 Time。相比之下,没有C或C++标准指定time_t
的纪元,尽管使用Unix Time是常见做法,并且由POSIX指定。
虽然未指定,但time_t
通常具有seconds
的精度。system_clock::time_point
通常具有比其细微的百万或十亿倍的精度。确切的精度未指定,但在API中记录,因此您可以在编译时或运行时发现它。system_clock::period
与system_clock::time_point::period
相同,并表示从一次滴答到下一次的编译时每秒的分数。
time_t
通常只是一个32位或64位有符号整数。这在通用代码中没有类型安全性。例如,您可以添加两个time_t
并进行编译。但是添加两个时间点是不合逻辑的(而减去它们是合适的)。chrono库在编译时捕获此类逻辑错误。添加两个time_point
不会编译。但是您可以添加time_point
和任何duration
。time_point
和duration
的逻辑代数在编译时为您检查。
如果您需要涵盖闰秒,则未指定但通常情况下time_t
不包括(通常是Unix Time)。使用system_clock
,Unix Time已指定(您知道您没有计算闰秒)。但是,在C++20中,还有另一个chrono时钟,它在其计数中包括闰秒:std::chrono::utc_clock
。像所有chrono时钟一样,该时钟具有其自己的类型安全的time_point
系列,具有称为utc_time<Duration>
的方便模板类型别名。您可以使用std::chrono::clock_cast
在它们之间进行转换。
auto tp_sys = clock_cast<system_clock>(tp_utc);
time_t
是 Unix 时间,在我的(较差的)答案中并没有得到改善。 - Yakk - Adam Nevraumontsystem_clock
实现在 C++17 中都使用 Unix 时间。这就是为什么我们能够在 C++20 中标准化现有的实践经验 :-)。虽然当一个主要的实现宣布要改变其纪元时,我们曾经非常接近无法做到这一点。(参见 http://www.youtube.com/watch?v=P32hvk8b13M&t=54m18s)。我成功地说服了他们,并且他们同意了我[将纪元标准化](http://eel.is/c++draft/time.clock.system#overview-1)的条件。他们非常友善,我非常感激。 - Howard Hinnantauto ms_since_epoch(std::int64_t m){
return std::chrono::system_clock::from_time_t(time_t{0})+std::chrono::milliseconds(m);
}
time_point
而不是持续时间time_t
。请参考:https://zh.cppreference.com/w/cpp/chrono/time_point/time_since_epoch - Ted Lyngmotime_t
(通常是秒),你可以使用from_time_t
函数来获取time_point
。然后,使用+
运算符和std::chrono::milliseconds
来添加剩余的毫秒数。 - Ted Lyngmo