ご挨拶、
最近、NSCalendarクラスで大きな問題に直面しました(私にはそう思われます)。
私の仕事では、紀元前4000年から紀元前2000年(グレゴリオ暦)までの長い期間で作業する必要があります。ある場所で、NSDateを100年間隔でインクリメントすることを余儀なくされました。ADタイムライン(0-> ...)で年をインクリメントすると、すべてが正常に機能しましたが、BCで同じことを試したとき、少し混乱しました。
問題は、紀元前3000年[編集]年に100年を追加しようとすると、何があっても紀元前3100年[編集]になるということです...個人的には、奇妙で非論理的だと感じました。正しい結果は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 components:fromDate:toDate:options:]では、紀元前の年の差を計算できません...追加の「WHY?」このパンドラの箱に。
PS:私は公式のドキュメントや他のリソースを調べていましたが、この問題に関して何も見つかりませんでした(または、それが機能することを意図していて、私はばかですか?)。