8 c++ time c++-chrono c++17 c++20
要创建当前时间的时间点,您可以使用:std::chrono::system_clock::now()
。
但是,我不知道如何创建自 UNIX 纪元以来给定毫秒数的时间点?
另外,std::chrono::time_point
甚至是推荐的方式来及时表示“瞬间”?还是应该std::time_t
优先考虑?
How*_*ant 11
这更容易/更简单:
std::chrono::system_clock::time_point tp{std::chrono::milliseconds{m}};
Run Code Online (Sandbox Code Playgroud)
上面的精度为system_clock::precision
(microseconds
在 macOS 上、nanoseconds
在 Linux 系统上、microseconds
在 Windows 上为 1/10)。如果需要,您还可以创建time_point
精度为milliseconds
:
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
tp{std::chrono::milliseconds{m}};
Run Code Online (Sandbox Code Playgroud)
在 C++20 中,这可以简化为:
std::chrono::sys_time tp{std::chrono::milliseconds{m}};
Run Code Online (Sandbox Code Playgroud)
sys_time
只是任何精度的 ssystem_clock
系列的模板类型别名。即上面的类型与之前创建的精度time_point
完全相同。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
,尽管使用Unix 时间是常见做法,并且由 POSIX 指定。
尽管未指定,但time_t
通常精度为seconds
. system_clock::time_point
通常具有比这更精细数百万或数十亿的精度。未指定确切的精度,但它记录在 API 中,以便您可以在编译时或运行时发现它。 与system_clock::period
相同,并且表示从一个时钟周期到下一个时钟周期的一秒的编译时分数。std::ratio
system_clock::time_point::period
time_t
通常只是一个 32 或 64 位有符号整数。这在通用代码中没有类型安全。例如,您可以添加两个time_t
并进行编译。然而,添加两个时间点是不合逻辑的(而减去它们则合乎逻辑)。chrono 库在编译时捕获此类逻辑错误。添加两个time_point
不会编译。但您可以添加 atime_point
和 any duration
。time_point
s 和s的逻辑代数duration
会在编译时为您检查。
如果您需要涵盖闰秒,则未指定,但通常time_t
不需要(通常是Unix Time)。使用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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5084 次 |
最近记录: |