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日之前的任何日期从朱利安转换为格里高利历。