如何从 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=]).如果需要,您还可以创建精度为 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
系列的任何精度的模板类型别名。 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::period
与 std::ratio
与 system_clock::time_point::period
相同,表示从一个刻度到下一个刻度的编译时秒数。
time_t
通常只是一个 32 或 64 位带符号整数。这在通用代码中没有类型安全。例如,您可以添加两个 time_t
并进行编译。然而,添加两个时间点是不合逻辑的(而减去它们是)。 chrono 库在编译时捕获此类逻辑错误。添加两个 time_point
不会编译。但是您可以添加 time_point
和任何 duration
。 time_point
s 和 duration
s 的逻辑代数在编译时为您检查。
如果您需要涵盖闰秒,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_point
s, 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);
为当前时间创建时间点,可以使用: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=]).如果需要,您还可以创建精度为 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
系列的任何精度的模板类型别名。 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
:
-
基于
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 oftime_t
, though using Unix Time 是常见的做法,并由 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
不会编译。但是您可以添加time_point
和任何duration
。time_point
s 和duration
s 的逻辑代数在编译时为您检查。如果您需要涵盖闰秒,
time_t
不指定但很常见(通常是 Unix Time). Withsystem_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 oftime_point
s, with its own convenience template type alias calledutc_time<Duration>
. And you can convert between them usingstd::chrono::clock_cast
.
system_clock
的像这样:
auto tp_sys = clock_cast<system_clock>(tp_utc);