You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:10:27