2013-11-25 50 views
0

我試圖對日程安排應用程序執行日期計算,但遇到夏令時問題。我試圖確定與兩個日期之間的天數:無夏時制時間的日期計算

NSDateComponents *activityComponents = [[NSDateComponents alloc]init]; 
activityComponents = [self.calendar components:NSDayCalendarUnit 
             fromDate:self.viewBeginDate 
             toDate:item.ES 
             options:0]; 
NSLog(@"Days: %d and hours: %d", [activityComponents day], [activityComponents hour]); 

其中self.viewBeginDateitem.ES都是NSDate的對象和self.calendar是公曆。

  • 2013年11月1日和2013年11月1日之間的計算的情況下,它提供了0。
  • 2013年11月1日和2013年11月2日之間計算的情況下,它提供了1.
  • 十一月間計算當2013年11月3日和2013年11月3日,它提供了2.
  • 在2013年11月1日至2013年11月4日期間計算時,它再次提供2 !

這裏是我的輸出:

Days: 0 and hours: 0 
    Days: 1 and hours: 0 
    Days: 2 and hours: 0 
    Days: 2 and hours: 24 
    Days: 3 and hours: 23 

我希望能夠確定2個NSDate對象之間的天數,而不通過夏令時的影響,因爲我的應用程序不關心本地或用戶所在的時區。我只想告訴我,2013年11月1日至2013年11月4日之間有3天。有什麼想法?

我的NSDate對象是使用以下格式的字符串創建的:2013-11-01 00:00:00 +0000。每個日期的時間設置爲00:00:00,GMT偏移量爲+0000。

我想到了兩個可能的選擇:

  • 使用isDaylightSavingTime檢查每個日期並創建一個新的(修改)日期1個小時的偏差,如果它的日期是夏令時。我很擔心增加的計算時間,因爲我的應用程序計算給定開始日期和其他日期數組之間的日期。這個數組最多可以有2000個日期。我不確定這是否是合法的問題...
  • 創建不受DST影響的自定義時區。這甚至有可能嗎?
+1

只需將您的NSCalendar設置爲UTC即可。 –

+0

我已將日曆更改爲UTC,結果沒有任何差異。我做對了嗎? '[自我。日曆setTimeZone:[NSTimeZone timeZoneWithName:@ 「UTC」];' – dfro

+0

我列出了用'的NSLog的時區(@ 「%@」,[NSTimeZone knownTimeZoneNames]);',並獲得在喜歡一個長長的清單「美國/諸如此類「和」歐洲/諸如此類「甚至格林尼治標準時間,但我沒有看到UTC。它不總是可用嗎? – dfro

回答

2

我可以使用10月27日左右(英國夏令時開始時)的日期和歐洲/倫敦時區設置來確認您的觀察結果。 「n天24小時」似乎是一個怪癖(善良的詞語爲一個錯誤,有人忘記攜帶)。

解決方案1:使用設置爲UTC的NSCalendar。 UTC沒有夏令時。解決方案2:由於您所有的時間都在午夜,最大夏令時時間爲1小時,因此「一天」在23到25小時之間。考慮到這一點,並在同一時間簡單地處理怪癖:

daysBetween = [activityComponents day] + ([activityComponents hour] >= 23 ? 1 : 0); 

注意,這僅作品因爲時間是在這兩個日期是一樣的!

+0

它的工作;我設置了'NSCalendar'到UTC與'[self.calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@「UTC」];'我沒有得到UTC早期工作,因爲我被錯誤地嘗試設置時區之前,我初始化日曆。一旦我將它移到alloc之後,init位就可以正常工作。感謝你的幫助! – dfro