2012-12-01 92 views
0

我正在做一個日曆程序。 '擴展重複事件'的代碼給了我無盡的麻煩。我通過使用mktime()來擴展事件以獲得'純'時間值,然後將重複增量(在這種情況下爲604800秒或7天)添加到它。然後使用localtime()來取消日曆結構。localtime()得到它錯誤,說日期= 9月31日

出現這種情況:

原始事件: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"} 

三[R評論: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()嗎?

+3

請記住,'tm_year'是自1900年以來的年數。所以如果你想要2012年(今年),它應該是112. –

+0

「...它不是**編譯器錯誤...」 (注意:這一次我沒有倒下 - 這是一個容易犯的錯誤,我確信我也會這麼做......) – 2012-12-01 21:38:18

回答

4

documentationstruct tm結構的成員是基於0的(通常在C中)。

int tm_mon month of year [0,11] 

因此,實際上一個月編號9是第10個月,這是十月,它有31天。

+0

即使在3912年,這也是'tm_year == 2012'代表的。順便說一句,月份數字是基於零的,因此它們可以用作月份名稱數組的索引; 'tm_mday'是基於一個的,因爲它沒有被用作索引(我們沒有在這個月的日子裏有名字,「Ides」儘管如此)。 –

+0

@KeithThompson當然:) – 2012-12-01 21:43:36

+0

啊,那是我的愚蠢。謝謝:) – SoItBegins

2

由於H2CO3指出,tm_mon是基於0的,所以日期實際上是10月31日,這是有道理的。

我想提一下,簡單地增加604800秒來提前7天可能不是用戶想要從日曆程序中獲得的。 604800爲正好七天,但如果用戶希望每七天上午10:00發生一次重複性事件,則添加604800秒並不總是會在上午10:00導致時間,因爲這忽略了特殊考慮因素,如夏令時和閏秒。

您可以改爲添加7到tm_mday。不要擔心超過本月的天數,因爲mktime()會更正它。

+0

感謝您的提示!我不知道mktime()會做這種規範化。 – SoItBegins

相關問題