2012-06-05 35 views
9

下面的代碼顯示問題:從1435年的第一天,推進全年不會導致1436增加一年組件伊斯蘭教歷失敗

任何想法什麼我失蹤的第一天?

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 


NSCalendar *islamic = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; 
NSDate *date = [islamic dateFromComponents:components]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setCalendar:islamic]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 

NSLog(@"%@", [dateFormatter stringFromDate:date]); // -> 01.01.1435 

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
[offsetComponents setYear:1]; 

NSDate *dateWithOffset = [islamic dateByAddingComponents:offsetComponents toDate:date options:0]; 

NSLog(@"%@", [dateFormatter stringFromDate:dateWithOffset]); 
// -> 30.12.1435 ... WHY NOT 01.01.1436 ???? 
+0

不是一種解決方案,但可以幫助縮小問題的範圍:您是否嘗試過使用不同類型的初始日曆,例如格里高利?嘗試一下,看看問題是否仍然存在,以排除或縮小伊斯蘭組件可能有一些怪癖造成這種情況。 – Dima

+0

與其他日曆(格列高利,希伯來,佛教)算法似乎工作正常 - 至少在我看的時間間隔。即使在大多數伊斯蘭教年代它都有效,但有些則沒有。 –

+0

我創建了一個新項目並將代碼複製到其中。在iOS 4.3,5.0和5.1下,我得到了預期的結果。 '呃。 1,1435'和'Muh。 1,1436' –

回答

3

我的懷疑是因爲夏令時/冬令時(夏令時)的差異。 MUH。 1,1435年落在2013年11月5日,而穆赫。 1,1436於2014年10月25日發佈。第一個日期是冬季,第二個是夏季。

您創建的第一個NSDate恰好是2013年11月5日00:00(午夜)。 「dateByAddingComponents:」通過將組件轉換爲秒來工作,並將其添加到第一個日期。在這種情況下,結果是2014年10月24日23:00,因爲夏天。

這也意味着由於時區之間的夏令時間差異,全世界不同人的結果可能會有所不同。

可以通過第一日期設置爲中午預防,而不是午夜(純日期的工作時,這是一般的好主意)的問題,:現在

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 
[components setHour:12]; 

,這是否是正確的「dateByAddingComponents」的行爲是另一個問題。

+0

好的參數:-)我想詳細調查時區方面並提供有關它的反饋。剛纔我匆忙 - 所以我不得不乞求一點耐心。 –

+0

您的懷疑是正確的:爲日曆,dateFormatter和NSDateComponents顯式設置timeZone(非夏令時值)會導致期望值:-) –