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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:15:30