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 告诉我 -23883033600 而不是 -23883638400 ......即 4 天后!是什么赋予了?我做错了什么还是 SQLite 或 Cocoa 错了?

编辑

刚刚检查了数学,似乎 Cocoa 给了我一个错误的值:根据Wolfram Alpha,在 2/27/1213 和 1/1/1970 之间有 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 回答