讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何将本地时间转换为UTC时间

冬强酱_2620

冬强酱_2620

发布时间:2026-07-13 20:07:26

|

674人浏览过

|

来源于php中文网

原创

std::gmtime直接将time_t解释为UTC时间,而非将本地时间转为UTC;正确转换需先用std::mktime将本地tm转为time_t,再用std::gmtime解析为UTC tm。

c++如何将本地时间转换为utc时间

用 std::gmtime 转换本地时间结构体时,别忘了先用 std::localtime 提取本地时间

直接对任意时间戳调用 std::gmtime 得到的是该时间戳对应的 UTC 时间结构体,不是“把本地时间转成 UTC”——它根本不知道你脑子里想的是本地时间。真正要做的,是先拿到本地时间(比如 time_t 值),再把它当作“本地解释的时间点”,反向算出这个时间点在 UTC 下对应什么。

常见错误是:拿到 time(nullptr) 后直接传给 std::gmtime,结果发现和 std::localtime 输出几乎一样(尤其在 UTC+0 时区)。这是因为 std::gmtime 把输入的 time_t 当作 UTC 时间戳来解析,而 time_t 本身是自 epoch 起的秒数,与本地/UTC 无关。

  • time_t 是绝对时间,不带时区信息
  • std::localtime 把 time_t 按当前系统时区解释为本地日历时间
  • std::gmtime 把同一 time_t 按 UTC 解释为日历时间
  • 所以:同一个 time_t,localtime 和 gmtime 返回的 tm 结构体不同,差的就是时区偏移

用 std::mktime + std::gmtime 实现“本地日历时间 → UTC 时间戳”的转换

如果你手头是一个本地日历时间(比如用户输入的“2024-06-15 14:30:00”),且明确这是本地时间,需要转成 UTC 对应的 time_t,不能直接塞进 std::gmtime —— 它只接受 time_t,不接受 tm。

正确做法是:先用 std::mktime 把本地 tm 转成 time_t(它会按本地时区理解并归一化),再用 std::gmtime 把这个 time_t 解析为 UTC 日历时间。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

立即学习“C++免费学习笔记(深入)”;

tm local_tm = {};
local_tm.tm_year = 2024 - 1900;
local_tm.tm_mon = 5; // June
local_tm.tm_mday = 15;
local_tm.tm_hour = 14;
local_tm.tm_min = 30;
local_tm.tm_sec = 0;
local_tm.tm_isdst = -1; // 让 mktime 自动判断夏令时
<p>time_t utc_timestamp = mktime(&local_tm); // 注意:mktime 修改 local_tm,设为本地时间对应的标准 time_t
tm* utc_tm = gmtime(&utc_timestamp); // 这才是 UTC 日历时间
  • mktime 输入是本地日历时间,输出是绝对时间戳(time_t)
  • gmtime 输入是绝对时间戳,输出是 UTC 日历时间
  • tm_isdst = -1 必须设置,否则夏令时判断可能出错
  • mktime 会修改传入的 tm 结构体(归一化字段),不要依赖原始值

C++20 <chrono> 的 zoned_time 更安全,但要注意时区数据库路径

如果你用的是 C++20 或更高标准,std::chrono::zoned_time 是更现代、更不易出错的方式。它显式绑定时区,避免隐式依赖系统 locale 或环境变量。

#include <chrono>
#include <date/date.h> // 需要 date 库(非标准,但被广泛采用)
<p>auto local = std::chrono::local_days{2024y/June/15} + 14h + 30min;
auto zt = date::zoned_time{"Asia/Shanghai", local}; // 显式指定本地时区
auto utc_time = zt.get_utc_time(); // 直接得到 UTC 时间点
  • 标准 C++20 尚未内置完整时区支持,<chrono> 中的 zoned_time 依赖实现(如 libc++ 支持,MSVC 不完全支持)
  • 实际项目中常借助 Howard Hinnant 的 date 库,需额外编译或链接
  • 时区名(如 "Asia/Shanghai")必须真实存在,否则构造失败;可用 date::get_tzdb().zones 查看支持列表
  • 注意:系统时区数据库(如 /usr/share/zoneinfo)路径需可访问,容器环境容易缺失

跨平台时,std::putenv("TZ=UTC") 不可靠,别这么干

有人试图通过修改 TZ 环境变量强制改变 localtime/gmtime 行为,这是危险操作:它影响整个进程甚至共享库,且 POSIX 规定 tzset() 必须被显式调用才生效,而 C++ 标准库不保证调用它。

  • putenv("TZ=UTC") 后不调 tzset(),localtime 可能仍用旧时区
  • 多线程下修改 TZ 会导致竞态,localtime 是非线程安全的
  • Windows 不支持 TZ 环境变量,行为不可移植
  • 真正需要动态时区切换时,应使用 date::locate_zone() 或平台 API(如 Windows 的 GetTimeZoneInformation)

时区转换的核心陷阱不在函数调用本身,而在对 time_t 本质的理解——它只是秒数,所有“本地”“UTC”语义都来自你用哪个函数去解释它。一旦混淆输入意图和函数契约,结果必然偏差数小时。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2148

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

959

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

387

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

366

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

560

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1389

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1177

2024.03.22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn