【问题标题】:Discrepancy between SQLite's strftime / julianday and Cocoa's timeIntervalSince1970?SQLite 的 strftime / julianday 和 Cocoa 的 timeIntervalSince1970 之间的差异?
【发布时间】:2011-07-08 22:17:04
【问题描述】:
 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 之前的任何日期从儒略历转换为公历。

【问题讨论】:

    标签: objective-c cocoa sqlite nsdate strftime


    【解决方案1】:

    您的示例日期早于Gregorian calendar,因此我认为可能会出现一些奇怪的情况。但是,在引入公历时,日期提前了 10 天,对于计算出的 4 天差异,我没有可靠的解释。

    【讨论】:

    • hm 但请参阅 nsdate 文档:“NSDate 模拟 1582 年 10 月从儒略历到公历的变化”developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
    • 是的,我读到了。这意味着苹果相信(或希望?:-))他们的实施是正确的。
    • 顺便说一句,它是 4 天而不是 10 天的原因是儒略历的闰年错误……因此首先更改为公历……
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多