0

我正在制作一个日历程序。“扩展重复事件”代码给我带来了无穷无尽的麻烦。我通过使用 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()吗?

4

2 回答 2

4

文档中:结构的成员是struct tm基于 0 的(通常在 C 中)。

int    tm_mon   month of year [0,11]

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

于 2012-12-01T21:36:37.807 回答
2

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

我想提一下,简单地将 604800 秒添加到提前 7 天可能不是用户希望从日历程序中获得的。604800正好是7 天,但如果用户希望每 7 天在上午 10:00 重复一次事件,添加 604800 秒并不总是会导致时间为上午 10:00,因为这忽略了夏令时和闰秒等特殊注意事项.

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

于 2012-12-01T21:52:43.707 回答