localtime() 出错,显示日期 = 9 月 31 日

SoI*_*ins 0 c datetime localtime mktime

我正在制作一个日历程序。“展开重复事件”代码给我带来了无穷无尽的麻烦。我通过使用 mktime() 来扩展事件以获得“纯”时间值,然后向其添加重复增量(在本例中为 604800 秒或 7 天)。然后使用 localtime() 来获取日历结构。

有时候是这样的:

原始事件:9 月 10 日

{tm_sec = 0, tm_min = 0, tm_hour = 16, tm_mday = 10, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 283, tm_isdst = 0, 
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}
Run Code Online (Sandbox Code Playgroud)

第一次重复:9月17日

{tm_sec = 0, tm_min = 0, tm_hour = 17, tm_mday = 17, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 290, tm_isdst = 1, 
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}
Run Code Online (Sandbox Code Playgroud)

第二次重复:9月24日

{tm_sec = 0, tm_min = 0, tm_hour = 16, tm_mday = 24, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 297, tm_isdst = 0,
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}
Run Code Online (Sandbox Code Playgroud)

第三次重复:9月31日?!

{tm_sec = 0, tm_min = 0, tm_hour = 16, tm_mday = 31, tm_mon = 9,
 tm_year = 2012, tm_wday = 4, tm_yday = 304, tm_isdst = 0,
 tm_gmtoff = -25200, tm_zone = 0x608ff0 "PDT"}
Run Code Online (Sandbox Code Playgroud)

有谁知道这里发生了什么事吗?需要我localtime()自己填写吗?

小智 6

文档中可以看出:该结构的成员struct tm是从 0 开始的(通常在 C 中)。

int    tm_mon   month of year [0,11]
Run Code Online (Sandbox Code Playgroud)

所以实际上编号的月份9是第 10 个月,即 10 月,有 31 天。