使用Time.h中mktime()函数返回错误日期的问题排查
问题原因与解决方法
核心错误点
你的代码存在两个违反struct tm结构体定义的关键错误,导致日期计算和显示异常:
tm_year赋值错误struct tm中的tm_year存储的是从1900年开始的偏移量,不是直接写入当前年份。你写nsr.tm_year = 2024,实际表示的是1900+2024=3924年,完全偏离了预期的2024年。正确写法应为nsr.tm_year = 2024 - 1900;(即124)。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
相关产品推荐
相关产品推荐

