NSCalendar dateFromКомпоненты:Часовой пояс GMT вместо systemTimeZone
-
27-10-2019 - |
Вопрос
Этот код
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).
Что мне нужно исправить, чтобы получить правильный часовой пояс?
Решение
Результат, который вы видите, совершенно нормальный.Если вы NSLog a NSDate
возражая непосредственно, вы получите все, что угодно description
метод возвращает значение даты по Гринвичу (но оно не высечено на камне).
NSDate
на объекты не распространяются часовые пояса.A NSDate
представляет собой абсолютный момент времени, отсчитываемый от контрольной даты.Например, на момент написания статьи текущая дата выглядит примерно так 337035053.199801
(секунды с момента отсчета даты), которая может быть представлена в виде 2011-09-06 20:50:53 GMT
или 2011-09-06 22:50:53 CEST
.Оба являются различными удобочитаемыми представлениями то же самое Дата.
В заключение, что вам нужно, чтобы получить правильный часовой пояс?Вам нужно использовать NSDateFormatter
чтобы получить строковое представление вашего NSDate
в любом часовом поясе, который вам нравится.
Другие советы
Этот вопрос возникает довольно часто, и ответ - использовать NSDateFormatter
Чтобы получить желаемый вывод для формата даты. В настоящее время он всегда напечатан с Timezone GMT. Вот обсуждение документации для NSDate
:
Дискуссия
Представление не гарантированно останется постоянным в разных выпусках операционной системы. Чтобы форматировать дату, вместо этого вы должны использовать объект Formatter Date (см. NSDateFormatteratter и Руководство по форматированию данных)