NSDate выражается в разных часовых поясах, т.е. в местном часовом поясе (GMT-400) в PST - PullRequest
3 голосов
/ 23 марта 2010

Я знаю, как использовать NSTimeZone, чтобы получить смещение для текущего времени в другом часовом поясе. NSDate всегда возвращает относительно GMT, так как я могу получить строку с правильной информацией о часовом поясе? Т.е. я беру текущее время, в котором я нахожусь (в EST), и, используя NSTimeZone, вычитаю 3 часа, необходимые для представления времени в PST. Но все, что я сделал, это вычел 3 часа из времени, которое все еще представлено относительно моего часового пояса. Как я могу заставить NSDateFormatter выплевывать время, используя часовой пояс пункта назначения?

Одна попытка, которую я попробовал, была:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; // for PST
NSDateComponents *dc = [cal components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:now];
[cal setTimeZone:tz];
NSDate *newDate = [cal dateFromComponents:dc];

Нет любви. Я мог бы взять отдельные компоненты даты и составить строку, но она не была бы локализуемой.

Сходная проблема:

NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; // for PST
NSString *abbreviation = [tz abbreviation];
NSString *name = [tz name];

И abbreviation, и name в итоге возвращают GMT-0800, а не PST, как я ожидал. Так что я даже не смог бы сделать вышеизложенное, если бы захотел. Что я делаю не так?

1 Ответ

12 голосов
/ 24 марта 2010

NSDate всегда возвращается относительно GMT

Это не имеет смысла. NSDate просто инкапсулирует абсолютный момент времени (давайте на секунду забудем об относительности) и вообще не имеет понятия часовых поясов. Сказать, что время NSDate относится к GMT, неверно.

Чтобы вывести дату в определенном часовом поясе, вы должны создать экземпляр NSDateFormatter и вызвать setTimeZone: для установки часового пояса. В соответствии с документами Unicode , строка формата @"zzz" должна выводить значение часового пояса как "PST".

...