如何以C++17线程安全方式获取指定日期的UTC当日起始时间?
获取指定本地日期对应的UTC时间(C++17线程安全实现)
你的现有代码通过mktime将本地时区的tm结构体转换为time_t,但mktime依赖全局时区状态且非线程安全。下面是基于C++17 <chrono>库的线程安全实现方案,完全规避传统C时间API的线程安全问题:
实现代码
#include <chrono> #include <iostream> #include <cstdio> // 用于strftime和gmtime_r int main() { using namespace std::chrono; // 构造本地时区的2022年11月29日00:00:00时间点 const auto local_datetime = local_days{year{2022}/11/29} + hours{0} + minutes{0} + seconds{0}; // 获取系统本地时区(C++17线程安全API) const auto local_timezone = current_zone(); // 将本地时间转换为UTC时间点 const auto utc_datetime = local_timezone->to_sys(local_datetime); // 计算Unix纪元到该UTC时间的毫秒数 const auto utc_milliseconds = duration_cast<milliseconds>(utc_datetime.time_since_epoch()).count(); std::cout << "UTC时间对应的毫秒数:" << utc_milliseconds << std::endl; // C++17手动格式化UTC时间(线程安全方式) const auto utc_time_t = system_clock::to_time_t(utc_datetime); std::tm utc_tm{}; gmtime_r(&utc_time_t, &utc_tm); // 线程安全的UTC时间解析函数 char time_buf[20]; std::strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &utc_tm); std::cout << "UTC时间:" << time_buf << std::endl; return 0; }
关键说明
- 线程安全保障:
- 使用
std::chrono的类型安全时间点,避免了tm结构体的全局状态依赖; current_zone()是C++17引入的线程安全函数,用于获取系统本地时区;- 时间转换用
to_sys()方法,无全局状态修改;格式化时用gmtime_r而非gmtime,避免线程竞争。
- 使用
- 精度与兼容性:
- 直接构造
local_days日期,无需手动计算年份偏移(如2022-1900),减少出错可能; - 代码兼容GCC 9+、Clang 9+、MSVC 2019+等支持C++17的编译器。
- 直接构造
内容的提问来源于stack exchange,提问作者iammilind
相关产品推荐
相关产品推荐

