NSCalendar dateFromКомпоненты:Часовой пояс GMT вместо systemTimeZone

StackOverflow https://stackoverflow.com/questions/7325837

Вопрос

Этот код

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 и Руководство по форматированию данных)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top