MacOS下strptime与mktime异常:01-01-1970对应时间戳354907420?
问题原因与解决方案
你的问题出在没有初始化struct tm结构体。strptime函数只会根据格式字符串填充匹配到的字段(比如tm_mday、tm_mon、tm_year),但结构体中未被匹配的字段(如tm_hour、tm_min、tm_sec、tm_isdst等)会保留内存中的随机垃圾值。mktime计算时间戳时会使用这些未初始化的垃圾值,最终导致计算出的时间完全偏离预期。
修复后的代码
#include <iostream> #include <ctime> #include <cstring> int main(int argc, const char * argv[]) { const char* timestamp = "01-01-2022"; const char* format = "%d-%m-%Y"; struct tm tm = {0}; // 初始化结构体,清零所有字段 // 也可以用 memset(&tm, 0, sizeof(tm)); if (strptime(timestamp, format, &tm) == NULL) { return -1; } // 可选:让系统自动判断夏令时状态,避免时区误差 tm.tm_isdst = -1; time_t x = mktime(&tm); std::cout << x << "\n"; }
关键说明
- 初始化
struct tm后,未被strptime填充的字段都会被设为0,mktime就能基于正确的基础值计算出符合预期的时间戳。 - 设置
tm_isdst = -1可以让mktime自动检测当前时区是否处于夏令时,进一步避免时区相关的计算偏差。
内容的提问来源于stack exchange,提问作者user7934593
相关产品推荐
相关产品推荐

