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

为何代码输出跳过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结构体字段理解误区:

  1. tm_mon采用0起始索引:0代表1月,1代表2月,以此类推,10对应的是11月而非直觉中的10月。代码中设置tm_mon = 10,实际对应的是11月30日,而非预期的10月30日。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:00:58