最近我遇到了一個很大的問題(對我來說)與NSCalendar類。
在我的任務中,我需要從4000BC到2000AD(公曆)開始的大量時間段工作。在某些地方,我被迫每隔100年增加一些NSDate。當在AD時間線中增加年份(0 - > ...)時,一切運行良好,但是當我在BC上嘗試同樣的事情時,我有點困惑。
問題是,當您嘗試將100年添加到3000BC [編輯]年時,無論如何,您都可以獲得3100BC [編輯]。個人而言,我發現它很奇怪且不合邏輯。正確的結果應該是2900BC。
下面是代碼示例給你看這個「不對」的行爲:
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
// initing
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setYear:-1000];
NSDate *date = [gregorian dateFromComponents:comps];
// math
NSDateComponents *deltaComps = [[[NSDateComponents alloc] init] autorelease];
[deltaComps setYear:100];
date = [gregorian dateByAddingComponents:deltaComps toDate:date options:0];
// output
NSString *dateFormat = @"yyyy GG";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:dateFormat];
NSLog(@"%@", [formatter stringFromDate:date]);
你能說這種行爲?這是應該如何工作,或者這是一個錯誤?我很困惑:S。
順便說一句:該方法[NSCalendar組件:fromDate:toDate:options:]不允許我們計算BC時代之間的差異...額外'爲什麼?'在這個潘多拉的盒子裏。
P.S .:我正在通過官方文檔和其他資源進行挖掘,但沒有發現任何關於這個問題(或者它的意圖是工作,所以我是個白癡?)。
3000AD + 100AD = 3100AD。這是基本的算術。從你的描述來看,數學是正確的。在你的代碼中,你想添加-1000到-100來獲得1100BC,我懷疑,但是因爲你沒有向我們展示你的代碼的輸出結果,所以我們不知道它是如何行爲不端。 – 2010-09-15 16:00:46
「...當你嘗試增加100年到3000AD年,你會得到3100AD無論如何...我個人覺得它很奇怪,不合邏輯。正確的結果應該是2900BC「你的意思是在整個段落中說」BC「?否則,它沒有意義:AD 3000 + 100 = AD 3100;那是正確的結果。 – 2010-09-15 18:52:20
喬納森:對不起,我犯了一個錯誤,它不是公元,是公元前。 – GregoryM 2010-09-16 06:22:50