localtime()表示日期=9月31日,但它出错了

localtime()表示日期=9月31日,但它出错了,c,datetime,mktime,localtime,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_isd

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

来自:
struct tm
结构的成员是基于0的(通常在C中)

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

来自:struct tm结构的成员以0为基础(通常在C中)


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

正如H2CO3所指出的,
tm_mon
是以0为基础的,所以日期实际上是10月31日,这是有意义的

我想说的是,仅仅增加604800秒来提前7天可能不是用户希望从日历程序中得到的。604800正好是七天,但如果用户希望每七天在上午10:00发生一次重复事件,则添加604800秒并不总是导致上午10:00发生时间,因为这忽略了夏时制时间和闰秒等特殊注意事项


您可以改为将7添加到
tm\mday
。不要担心超过一个月的天数,因为
mktime()
会纠正它。

正如H2CO3所指出的,
tm_mon
是以0为基础的,所以日期实际上是10月31日,这是有意义的

我想说的是,仅仅增加604800秒来提前7天可能不是用户希望从日历程序中得到的。604800正好是七天,但如果用户希望每七天在上午10:00发生一次重复事件,则添加604800秒并不总是导致上午10:00发生时间,因为这忽略了夏时制时间和闰秒等特殊注意事项


您可以改为将7添加到
tm\mday
。不要担心超过一个月的天数,因为
mktime()
会纠正它。

记住
tm_year
是自1900年以来的年数。因此,如果你想要2012年(今年),它应该是112。”…这不是一个编译器错误…(注:这次我没有投反对票-这是一个容易犯的错误,我相信我也会这样做…)记住
tm_year
是自1900年以来的年份数。因此,如果你想要2012年(今年),它应该是112。”…这不是一个编译器错误…(注:这次我没有投否决票-这是一个容易犯的错误,我相信我也会这样做…)即使在3912年,这也是
tm_year==2012
所代表的。顺便说一句,月份数字是以零为基础的,因此它们可以用作月份名称数组的索引
tm_mday
是一个基于日期的日期,因为它没有在索引中使用(我们没有一个月中的日期的名称,“Ides”尽管如此)。即使是在3912年,也就是
tm_year==2012
所代表的年份。顺便说一句,月份数字是以零为基础的,因此它们可以用作月份名称数组的索引
tm_mday
是基于一个的,因为它没有在索引中使用(我们没有一个月中的天数的名称,“Ides”尽管如此)。感谢您的提示!我不知道mktime()会做这种规范化。谢谢你的提示!我不知道mktime()会进行这种规范化。
int    tm_mon   month of year [0,11]