1
 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
 [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
 [dateFormatter setDateFormat:@"yyyy-MM-dd"];
 NSDate *date1 = [dateFormatter dateFromString:@"1213-02-27"];
 NSTimeInterval nsdateResult = [date1 timeIntervalSince1970];
 NSTimeInterval sqliteResult = -23883638400;
 GHAssertEquals(sqliteResult, nsdateResult, @"sqlite and nsdate should agree");

予想される数は、SQLite が結果であるべきだと私に言ったものですが、Cocoa が -23883638400 ではなく -23883033600 を教えてくれるので、このテストは失敗します... つまり 4 日後です! 何を与える?私は何か間違ったことをしていますか、それとも SQLite または Cocoa のどちらかが間違っていますか?

編集

計算を確認したところ、Cocoa が間違った値を示しているようです。Wolfram Alphaによると、1213 年 2 月 27 日から 1970 年 1 月 1 日までの間に 276431 日あります。この時間 24*60*60 を取ると、SQLite によって与えられた値が得られます...つまり、私は何か間違ったことをしているのですか、それともこれはある種の Cocoa バグですか?

編集 2 Fvu は正しく、1582 年のグレゴリオ暦/ユリウス暦の狂気と関係があります。

NSDate *date1 = [dateFormatter dateFromString:@"1582-10-15"];
NSDate *date2 = [dateFormatter dateFromString:@"1582-10-14"];
NSTimeInterval i = [date2 timeIntervalSinceDate:date1];

驚くべきことに、i は 777600 です。つまり、10/14 は 10/15 より 9 日後です。これは、10/15 がグレゴリオ暦の日付として表示されるのに対して、自動的にユリウス日として表示されるためです。基本的に、10/15 より前の日付をユリウス暦からグレゴリオ暦に変換する必要があります。

4

1 に答える 1

2

サンプルの日付はグレゴリオ暦よりも前のものであるため、いくつかの奇妙な点が予想されると思います. ただし、グレゴリオ暦の導入時に日付が 10 日進んだように、計算された 4 日間の違いについての完全な説明はありません。

于 2011-07-08T22:31:08.193 に答える