UTC日期字符串与Unix时间戳互转及时间偏移实现方法
UTC时间字符串与Unix时间戳转换(加2小时需求实现)
方案1:使用<ctime>库实现(兼容C++所有标准版本)
该方案兼容性最高,可在绝大多数旧编译环境下运行:
#include <iostream> #include <ctime> #include <string> int main() { const std::string utc_str = "2021-11-15 12:10"; struct tm tm_val = {}; // 1. 解析UTC时间字符串为tm结构 strptime(utc_str.c_str(), "%Y-%m-%d %H:%M", &tm_val); // 2. 转换为秒级Unix时间戳,注意`timegm`是UTC时区专用,不要用本地时区的mktime time_t timestamp = timegm(&tm_val); std::cout << "原始时间戳: " << timestamp << std::endl; // 3. 执行加2小时操作,和示例逻辑一致 timestamp += 60 * 60 * 2; std::cout << "加2小时后时间戳: " << timestamp << std::endl; // 4. 新时间戳转回UTC时间字符串,`gmtime`是UTC时区专用,不要用本地时区的localtime struct tm* new_tm = gmtime(×tamp); char buf[20] = {0}; strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M", new_tm); std::cout << "转换后UTC字符串: " << buf << std::endl; return 0; }
- 注意:Windows环境下部分编译器没有内置
strptime,可自行引入轻量替代实现,或使用下方C++20方案
方案2:使用C++20 <chrono>库实现(代码更简洁,无原生函数兼容问题)
C++20对chrono库做了解析、格式化、时区相关的增强,代码更安全易读:
#include <iostream> #include <chrono> #include <string> #include <format> int main() { const std::string utc_str = "2021-11-15 12:10"; std::chrono::sys_time<std::chrono::minutes> tp; // 1. 直接解析UTC时间字符串为系统时钟时间点 std::chrono::parse("%Y-%m-%d %H:%M", utc_str, tp); // 2. 转换为秒级Unix时间戳 auto timestamp = std::chrono::system_clock::to_time_t(tp); std::cout << "原始时间戳: " << timestamp << std::endl; // 3. 执行加2小时操作,两种写法等效 tp += std::chrono::hours(2); // 也可以用 timestamp += 60*60*2; timestamp = std::chrono::system_clock::to_time_t(tp); std::cout << "加2小时后时间戳: " << timestamp << std::endl; // 4. 直接格式化为目标格式UTC字符串 std::string new_utc_str = std::format("{:%Y-%m-%d %H:%M}", tp); std::cout << "转换后UTC字符串: " << new_utc_str << std::endl; return 0; }
输出示例
两种方案运行输出一致:
原始时间戳: 1636978200 加2小时后时间戳: 1636985400 转换后UTC字符串: 2021-11-15 14:10
内容的提问来源于stack exchange,提问作者bolt
相关产品推荐
相关产品推荐

