为何代码输出跳过10月31日?C语言time函数使用问题解析
问题:循环递增时间时跳过10月31日的原因分析及解决方案
问题场景
在Ubuntu 24.04.1环境下,编写C语言代码调用time.h中的mktime、localtime等函数,期望从10月30日23:59:59开始,每次增加100秒并输出时间,能看到10月31日的时间记录。但实际输出直接从30/10/2024_23:59跳到1/11/2024_00:01,完全跳过了10月31日。
初始化tm结构体的代码如下:
struct tm myDate; myDate.tm_mday = 30; myDate.tm_mon = 10; myDate.tm_year = 2024; myDate.tm_hour = 23; myDate.tm_min = 59; myDate.tm_sec = 59;
错误原因
最初怀疑是函数bug或调用方式错误,最终确认是两个新手常见的tm结构体字段理解误区:
tm_mon采用0起始索引:0代表1月,1代表2月,以此类推,10对应的是11月而非直觉中的10月。代码中设置tm_mon = 10,实际对应的是11月30日,而非预期的10月30日。tm_year是1900年起的偏移量:直接设置为2024会导致年份变成1900+2024=3924,而非2024年。结合tm_mon的错误,初始时间实际是3924年11月30日,递增后进入12月,输出时因格式化逻辑错误才显示成2024年的11月1日,自然看不到10月31日的记录。
修复方案
修正tm_mon和tm_year的取值,同时补充tm_isdst字段的初始化(否则mktime行为未定义):
struct tm myDate; myDate.tm_mday = 30; myDate.tm_mon = 9; // 0对应1月,9对应10月 myDate.tm_year = 2024 - 1900; // 计算1900年以来的偏移量 myDate.tm_hour = 23; myDate.tm_min = 59; myDate.tm_sec = 59; myDate.tm_isdst = -1; // 让系统自动判断夏令时
验证效果
修正后,初始时间为2024年10月30日23:59:59,每次增加100秒后,会依次输出10月31日00:01:39、00:03:19等时间,不会再跳过10月31日。
内容的提问来源于stack exchange,提问作者Cyriaque
相关产品推荐
相关产品推荐

