Расхождение между strftime / julianday и SQLite timeIntervalSince1970?
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, должно быть результатом, но этот тест не пройден, поскольку Какао сообщает мне -23883033600 вместо -23883638400... то есть через 4 дня! Что дает? Я делаю что-то не так или SQLite или Какао не так?
редактировать
Только что проверил математику, и кажется, что Какао дает мне неправильное значение: согласно Вольфраму Альфе, между 27.02.1213 и 01.01.1970 существует 276431 день. Возьмите это время 24*60*60, и вы получите значение, данное SQLite... так что я делаю что-то не так или это какая-то ошибка Какао?
Править 2 Фву прав, это связано с григорианским / юлианским безумием еще в 1582 году.
NSDate *date1 = [dateFormatter dateFromString:@"1582-10-15"];
NSDate *date2 = [dateFormatter dateFromString:@"1582-10-14"];
NSTimeInterval i = [date2 timeIntervalSinceDate:date1];
Удивительно, но я 777600, то есть 10/14 на 9 дней ПОЗЖЕ, чем 10/15, потому что он автоматически рассматривается как юлианская дата, тогда как 10/15 рассматривается как григорианская дата. Поэтому в основном мне нужно преобразовать любые даты до 10/15 из юлианского в григорианский календарь.
1 ответ
Ваша дата выборки предшествует григорианскому календарю, поэтому я думаю, что некоторые странности можно ожидать. Однако, поскольку на момент введения григорианского календаря дата была увеличена на 10 дней, у меня нет пуленепробиваемого объяснения рассчитанной разницы в 4 дня.