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

使用Time.h中mktime()函数返回错误日期的问题排查

问题原因与解决方法

核心错误点

你的代码存在两个违反struct tm结构体定义的关键错误,导致日期计算和显示异常:

  1. tm_year赋值错误
    struct tm中的tm_year存储的是从1900年开始的偏移量,不是直接写入当前年份。你写nsr.tm_year = 2024,实际表示的是1900+2024=3924年,完全偏离了预期的2024年。正确写法应为nsr.tm_year = 2024 - 1900;(即124)。

  2. tm_mon含义误解与输出错误
    tm_mon是0基数字段,取值范围0-11,分别对应公历1-12月。你设置nsr.tm_mon = 2,实际表示的是3月而非2月;同时输出时直接打印tm_mon,导致把3月显示为02,再加上3月的31日,就出现了看似矛盾的"2月31日"——本质是显示逻辑错误,而非日期计算未滚动。

另外,加小数值时看似正确,只是因为错误的初始值未触发跨月显示矛盾,并非计算逻辑真的正确。

修正后的代码

#include <stdio.h>
#include <time.h>

int main() {
    struct tm nsr;
    struct tm ssr; 
    
    // 正确初始化tm结构体,遵循字段定义
    nsr.tm_hour = 6; 
    nsr.tm_min = 8; 
    nsr.tm_sec = 46;
    nsr.tm_mday = 29;
    nsr.tm_mon = 1; // 0=1月,1=2月(对应2024年闰年2月)
    nsr.tm_year = 2024 - 1900; // 2024年对应偏移量124
    nsr.tm_isdst = -1; // 让mktime自动检测夏令时
    
    mktime(&nsr); 

    ssr = nsr; 
    ssr.tm_sec += 186600; // 增加51小时50分钟
    mktime(&ssr);

    // 输出时转换为真实公历日期格式
    printf("%02d:%02d:%02d\n", ssr.tm_hour, ssr.tm_min, ssr.tm_sec); 
    printf("%02d:%02d:%04d\n", ssr.tm_mday, ssr.tm_mon + 1, ssr.tm_year + 1900); 
    return 0;
}

修正后的输出

09:58:46
02:03:2024

关键注意事项

  • 永远遵循struct tm的字段规则:tm_year = 目标年份 - 1900,tm_mon = 目标月份 - 1。
  • 调用mktime时建议设置tm_isdst = -1,让系统自动处理夏令时,避免时间计算偏差。
  • 输出日期时,必须对tm_mon和tm_year做转换,才能得到符合日常习惯的公历日期。

内容的提问来源于stack exchange,提问作者Suresh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:12:27