2016-05-25 3 views
1

Я создал NSDate по dateFromComponents, используя NSCalendar с NSGregorianCalendar идентификатором, вот что странно: дата получения некорректной, если это до определенного момента времени до 1900/12/31NSDate создан с NSDateComponents некорректно?

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.year = 1900; components.month = 12; components.day = 31; 
NSDate *date = [calendar dateFromComponents:components]; 

components.year = 1901; components.month = 1; components.day = 1; 
NSDate *date2 = [calendar dateFromComponents:components]; 

NSLog(@"%@",calendar.timeZone.description); 
NSLog(@"%@",date); 
NSLog(@"%@",date2); 

Журнал будет :

2016-05-25 14:58:21.014 date[79754:2192157] Asia/Shanghai (GMT+8) offset 28800 
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-30 15:54:17 +0000 
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-31 16:00:00 +0000 

Как вы можете видеть, в течение дня есть разрыв в 5 минут. Однако, если я установил timeZone на [NSTimeZone timeZoneForSecondsFromGMT:], даже с тем же отклонением секунд - 28800, это будет нормально. В чем причина этого?

ответ

1

Нет, дата неправильная. Вместо этого код NSCalendar знает о календарах, о которых вы не мечтали, например, календари, изменяющие свои временные смещения в некоторые моменты времени в прошлом.

Вы попросили календарь в Азии/Шанхае преобразовать две даты, одну за день до того, как они изменили свой часовой пояс, один на следующий день после того, как они изменили свой часовой пояс, и оба раза преобразуются правильно. В ту ночь все в Шанхае должны были приспособить свои часы.

+0

Я получаю тот же точный результат, если я установил часовой пояс в Asia/Shanghai. Хорошо поймал. – Desdenova

-2

Попробуйте это!

NSCalendar *calendar = [NSCalendar currentCalendar]; 

NSDateComponents *components = [[NSDateComponents alloc] init]; 

[components setYear:1987]; 
[components setMonth:3]; 
[components setDay:17]; 
[components setHour:14]; 
[components setMinute:20]; 
[components setSecond:0]; 

NSDate *date = [calendar dateFromComponents:components]; 

Надежда это Помощь :)

+0

Могу ли я спросить, почему вы голосовали? –

+0

Потому что ваш ответ не имеет значения. – Desdenova

+0

bro Я думаю, ваш вопрос создает NSdate из компонентов правильно? –

1

Интересный вопрос. То, что вы видите, это последствия изменения часового пояса от локального среднего времени до стандартного китайского времени в 01-01-1901, когда часы были повернуты назад 05m43s.

Подробнее here.

Смежные вопросы