日期= 9月31日,localtime()弄错了

时间:2012-12-01 21:33:21

标签: c datetime mktime localtime

我正在制作日历程序。 “扩展重复事件”代码给我带来了麻烦。我通过使用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"}

首次重复: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"}

第二次重复: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"}

第三次重复: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"}

有谁知道这里发生了什么?我是否必须自己填写localtime()

2 个答案:

答案 0 :(得分:4)

来自documentationstruct tm结构的成员从0开始(通常在C中)。

int    tm_mon   month of year [0,11]

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

答案 1 :(得分:2)

正如H2CO3指出的那样,tm_mon是基于0的,所以日期实际上是10月31日,这是有道理的。

我想提一下,简单地添加604800秒以提前7天可能不是用户想要的日历程序。 604800 完全七天,但如果用户希望每七天上午10:00发生一次重复活动,则添加604800秒并不总是会产生上午10:00的时间,因为这会忽略特殊注意事项比如夏令时和闰秒。

您可以做的是向tm_mday添加7。不要担心超过该月的天数,因为mktime()会纠正它。