Расхождение между 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 дня.

Другие вопросы по тегам