980 секунд теряется при использовании NSDateFormatter для преобразования часовых поясов - PullRequest
3 голосов
/ 15 августа 2011

При разборе дат в разных часовых поясах я заметил, что NSDateFormatter выдает странные результаты при работе с датами в далеком прошлом.

У меня есть следующий код:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:usLocale];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];

NSString* dateString1 = @"1890-09-30 12:00";
NSString* dateString2 = @"1890-10-01 12:00";

NSLog(@"original timezone %@", [dateFormatter timeZone]);

NSDate* localDate1 = [dateFormatter dateFromString:dateString1];
NSDate* localDate2 = [dateFormatter dateFromString:dateString2];
NSLog(@"localDate1 %@ » %@", dateString1, localDate1);
NSLog(@"localDate2 %@ » %@", dateString2, localDate2);

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

NSDate* utcDate1 = [dateFormatter dateFromString:dateString1];
NSDate* utcDate2 = [dateFormatter dateFromString:dateString2];
NSLog(@"utcDate1   %@ » %@", dateString1, utcDate1);
NSLog(@"utcDate2   %@ » %@", dateString2, utcDate2);

Я ожидаю, что localDates будет на один час меньше времени UTC, поскольку мой часовой пояс CET. Вместо этого я получаю это:

original timezone Europe/Budapest (CEST) offset 7200 (Daylight)
localDate1 1890-09-30 12:00 » 1890-09-30 10:43:40 +0000
localDate2 1890-10-01 12:00 » 1890-10-01 11:00:00 +0000
utcDate1   1890-09-30 12:00 » 1890-09-30 12:00:00 +0000
utcDate2   1890-10-01 12:00 » 1890-10-01 12:00:00 +0000

После некоторого расследования кажется, что ошибка появляется для дат ранее, чем 1890-09-30 23: 43.

В чем причина этого? Это ошибка в обработке даты iOS?

1 Ответ

6 голосов
/ 15 августа 2011

чудесный мир часовых поясов:

Когда местное стандартное время приближалось Понедельник, 1 октября 1890 года, 00:00:00 часы были переведены назад на 0:16:20 часов Воскресенье, 30 сентября 1890 года, 23:43:40 по местному стандартному времени вместо

http://www.timeanddate.com/worldclock/clockchange.html?n=50&year=1890

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...