F_S*_*idt 3 c++ time utc c++20
我想通过网络连接发送一个时间点来检测 ping 时间并进行其他计算。时间必须具有毫秒精度,但使用:
auto currently = std::chrono::time_point_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now()
);
Run Code Online (Sandbox Code Playgroud)
...返回(当然)系统时间,当然不是 UTC。有没有什么方法可以计算 UTC 值,而无需将 转换time_point为 atime_t然后再转换回来?我读过一些关于 的内容std::chrono::utc_clock,但即使使用 C++20,我也无法在标头中找到定义<chrono>。
这将是一个可行的解决方案,但它是一个糟糕的解决方案,因为它效率非常低......必须有更好的东西:
auto currently = std::chrono::time_point_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now()
);
time_t time = std::chrono::system_clock::to_time_t(currently);
struct tm *tm = gmtime(&time);
// Create a new time_point from struct tm that is in UTC now
Run Code Online (Sandbox Code Playgroud)
std::chrono::utc_clock存在于 C++20 标准中,但 clang 和 GCC 都尚未在其标准库中实现它。这对于最新的语言标准来说很常见。并非所有编译器都实现了所有功能。
然而,从 C++20 开始,std::chrono::system_clock有一个指定的纪元,即1970-01-01 00:00.000 UTC,它与 的隐含纪元相同std::time_t:
system_clock测量 Unix 时间(即自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 开始的时间,不包括闰秒)。
请注意,std::time_t没有任何指定的纪元,它只是通常1970-01-01 00:00.000 UTC:
虽然没有定义,但这几乎总是一个整数值,保存自 UTC 1970 年 1 月 1 日 00:00 以来的秒数(不包括闰秒),对应于 POSIX 时间
所以你需要做的是:
std::chrono::time_point currently = std::chrono::time_point_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now()
);
std::chrono::duration millis_since_utc_epoch = currently.time_since_epoch();
// use millis_since_utc_epoch.count() to get the milliseconds as an integer
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10135 次 |
| 最近记录: |