2011-04-01 73 views
1

我們知道NSDate是UTC/GMT。換句話說,沒有時區信息與它相關聯。NSCalendar組件不考慮時間

有高層次的類,如NSCalendar和NSTimeZone和NSDateComponents,考慮到時區。

基於此,我使用以下代碼來計算兩個日期之間的天數差異。然而,我得到的結果似乎是因爲計算完全忽略了時間。我想知道如果我做錯了什麼,或者如果這是由於某種原因設計的。

下面是代碼和數據:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *comp = [calendar components:NSDayCalendarUnit fromDate:startDate toDate:stopDate options:0]; 
NSInteger day = [comp day]; 

調試輸出:

(gdb) po startDate 
2011-04-01 03:52:13 +0000 
(gdb) po stopDate 
2011-04-03 15:52:13 +0000 
(gdb) p (int) day 
$1 = 2 

的時區是太平洋標準時間和上述轉換後的日期,以PST有:

startDate = 2011-03-31 8:52:13 -7 
stopDate = 2011-04-03 8:52:13 -7 

因此,我期望他們之間有4天,而不是2.(31日,1日,2日和3日)

我認爲小時被忽略的原因是因爲如果將小時數加到計算中,我們會得到2天12小時。

我做錯了什麼或者這是如何設計的?

謝謝 萬斯

回答

0

不太。當您在太平洋時區格式化日期時,會得到:

Calendars[38041:707] start: 2011-03-31 20:52:13 -0700 
Calendars[38041:707] stop : 2011-04-03 08:52:13 -0700 

這與您發佈的內容有點不同。你們似乎表示上午8點,而不是下午8點。

此外,components:fromDate:toDate:options:將計數整個單位。因此,如果你要求的天數,它會說他們之間有兩天的時間,這是有的。

也許一個更好的方式做你要找的內容是這樣的:

NSUInteger startOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:startDate]; 
NSUInteger stopOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:stopDate]; 

那麼它們之間的天數將是(stopOrdinal - startOrdinal)。在你的日期的情況下,這將產生3(格林威治標準時間4月1日格林威治標準時間4月3日)如果你真的想要忽略時間部分,你將不得不弄清楚如何在目標時區內切斷日期的時間部分。這將涉及將日期轉換爲NSDateComponent對象,然後將-hour-minute-second部分設置爲0.完成此操作後,您可以將其更改回NSDates,然後繼續進行差異計算。