SQLite的strftime / julianday和Cocoa的timeIntervalSince1970之间的差异?

时间:2011-07-08 22:17:05

标签: objective-c cocoa sqlite nsdate strftime

 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,在2013年2月27日到1970年1月1日之间有276431天。拿这个时间24 * 60 * 60,你得到SQLite给出的值...所以我做错了什么或者这是某种Cocoa bug?

编辑2 Fvu是对的,它与1582年格里高利/朱利安的疯狂有关。

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

令人惊讶的是,我是777600,即10/14比10/15晚9天,因为它自动被视为儒略日期,而10/15被视为公历日期。所以基本上我需要做的是将10月15日之前的任何日期从朱利安转换为格里高利历。

1 个答案:

答案 0 :(得分:2)

您的样本日期早于Gregorian calendar,所以我认为可能会出现一些奇怪的情况。但是,在引入公历时,提前10天的日期我没有计算4天差异的防弹解释。