NSCalendar dateFromComponents: часовой пояс GMT вместо systemTimeZone - PullRequest
6 голосов
/ 07 сентября 2011

Этот код

NSCalendar *calendar =[NSCalendar currentCalendar];
[gregorian setTimeZone:tz];

NSLog(@"%@", [gregorian timeZone]);

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[NSDate date]];

[comp setDay:info.day];
[comp setMonth:info.month];
[comp setYear:info.year];
[comp setHour:info.hour];
[comp setMinute:info.minute];
[comp setSecond:info.second];
[comp setTimeZone:tz];  

NSLog(@"%@", [comp timeZone]);
NSLog(@"%@", [gregorian dateFromComponents:comp]);

показывает следующее в консоли:

Europe/Moscow (MSKS) offset 14400 (Daylight)

Europe/Moscow (MSKS) offset 14400 (Daylight)

2011-08-31 20:00:00 +0000

Итак, часовой пояс для календаря и компонентов указан правильно, но [gregorian dateFromComponents:comp] возвращает значение NSDate с неверным часовым поясом (GMT).

Что мне нужно исправить, чтобы получить правильный часовой пояс?

Ответы [ 2 ]

6 голосов
/ 07 сентября 2011

Вывод, который вы видите, совершенно нормален. Если вы NSLog NSDate объект напрямую, вы получите то, что возвращает метод description, который является представлением даты по Гринвичу (но это не вырезано в камне).

NSDate объекты не подчиняются часовым поясам. A NSDate представляет собой абсолютный момент времени, измеренный с контрольной даты. Например, на момент написания текущей даты было что-то вроде 337035053.199801 (секунд с контрольной даты), которое может быть представлено как 2011-09-06 20:50:53 GMT или 2011-09-06 22:50:53 CEST. И то, и другое - это различимые для человека представления одной и той же даты.

В заключение, что вам нужно, чтобы получить правильный часовой пояс? Вам нужно использовать NSDateFormatter, чтобы получить строковое представление вашего NSDate в любом часовом поясе, который вам нравится.

1 голос
/ 07 сентября 2011

Этот вопрос возникает довольно часто, и ответом является использование NSDateFormatter для получения желаемого результата для формата даты.В настоящее время он всегда печатается с часовым поясом GMT.Вот обсуждение документации для NSDate:

Обсуждение Не гарантируется постоянство представления в разных выпусках операционной системы.Для форматирования даты вы должны использовать вместо этого объект форматирования даты (см. NSDateFormatter и Руководство по форматированию данных)

...