gpt4 book ai didi

c++ - C++ 中的当前 UTC 时间点

转载 作者:行者123 更新时间:2023-12-01 14:47:01 29 4
gpt4 key购买 nike

我想通过网络连接发送一个时间点来检测 ping 时间和进行其他计算。时间必须具有毫秒精度,但使用:

auto currently = std::chrono::time_point_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now()
);

... 返回(当然)系统时间,当然不是 UTC。有没有办法在不转换 time_point 的情况下计算 UTC 值?到 time_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

最佳答案

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 measures Unix Time (i.e., time since 00:00:00 Coordinated Universal Time (UTC), Thursday, 1 January 1970, not counting leap seconds).

请注意 std::time_t没有任何指定的纪元,通常是 1970-01-01 00:00.000 UTC:

Although not defined, this is almost always an integral value holding the number of seconds (not counting leap seconds) since 00:00, Jan 1 1970 UTC, corresponding to POSIX time

所以你需要做的是:

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

关于c++ - C++ 中的当前 UTC 时间点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63501664/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com