C++中如何将日期格式字符串转换为Unix时间戳?
将日期字符串转换为Unix时间戳的可行实现
你需要把格式如%d/%m/%Y, %H:%M:%S的日期字符串转回Unix时间戳,之前尝试strptime和流提取未成功,下面给出两种可靠实现及踩坑说明:
方法一:使用strptime(兼容C/C++)
strptime本身是可行的,失败多因未正确初始化结构体或格式不匹配,正确写法如下:
#include <iostream> #include <ctime> #include <string> int main() { const std::string date_str = "03/02/2022, 14:44:00"; // 对应你之前的时间戳1643873040 struct tm timeinfo = {0}; // 必须初始化,避免垃圾值干扰转换 // 按指定格式解析字符串,格式需与输入完全匹配 if (strptime(date_str.c_str(), "%d/%m/%Y, %H:%M:%S", &timeinfo) == nullptr) { std::cerr << "日期字符串解析失败" << std::endl; return 1; } // mktime将本地时区的tm结构体转为Unix时间戳,与你之前localtime的逻辑对应 time_t timestamp = mktime(&timeinfo); if (timestamp == -1) { std::cerr << "转换为时间戳失败" << std::endl; return 1; } std::cout << "转换后的时间戳:" << timestamp << std::endl; return 0; }
关键注意事项:
- 必须初始化
tm结构体为0,未赋值的字段(如tm_isdst)会导致mktime计算错误 - 格式字符串要完全匹配输入的分隔符(逗号、空格都不能少)
mktime默认使用本地时区,和你之前用localtime转换的时区逻辑一致
方法二:使用C流与std::get_time(C11及以上)
流提取失败通常是未正确使用std::get_time指定格式,示例代码:
#include <iostream> #include <ctime> #include <string> #include <sstream> #include <iomanip> int main() { const std::string date_str = "03/02/2022, 14:44:00"; struct tm timeinfo = {0}; std::istringstream ss(date_str); // 用std::get_time指定解析格式 ss >> std::get_time(&timeinfo, "%d/%m/%Y, %H:%M:%S"); if (ss.fail()) { std::cerr << "日期字符串解析失败" << std::endl; return 1; } time_t timestamp = mktime(&timeinfo); if (timestamp == -1) { std::cerr << "转换为时间戳失败" << std::endl; return 1; } std::cout << "转换后的时间戳:" << timestamp << std::endl; return 0; }
关键注意事项:
- 需包含
<iomanip>头文件才能使用std::get_time - 流解析的格式字符串必须与输入完全匹配,包括所有非日期字符
- 同样要初始化
tm结构体,避免未定义行为
常见失败原因排查
- 格式字符串不匹配:比如把
dd/mm/yyyy写成%m/%d/%Y,或遗漏逗号、空格 tm结构体未初始化:未赋值的字段会导致mktime无法正确计算时间戳- 时区冲突:若环境时区与时间戳对应的时区不一致,可考虑用
gmtime+timegm(部分平台支持)替代本地时区接口
内容的提问来源于stack exchange,提问作者Федор
相关产品推荐
相关产品推荐

