Создать проблему часового пояса NSDate

Я загружаю даты из своего веб-сервиса, я отправляю даты в формате (время по Гринвичу): 11.02.11 10:56:09

Я создаю форму NSDate, используя NSDateFormatter как таковой:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
NSDate *journeyDate = [dateFormatter dateFromString:str];
[dateFormatter release];

Это прекрасно работает после того, как я сравниваю это с текущей датой, чтобы получить относительные интервалы времени.

Проблема заключается в том, что когда телефон настроен в другом часовом поясе, когда я загружаю дату из своего API и использую средство форматирования даты, кажется, что происходит то, что телефон предполагает, что строка даты является локальным временем, и он преобразует его по Гринвичу.

Пример:

Я загружаю дату со временем 10 утра из API. Телефон настроен на PDT. Средство форматирования даты создает NSDate, предполагая, что моя строка даты с 10:00 действительно имеет отношение к телефону.

Я получаю дату и время, равные 5 вечера, добавляя 10 часов.

Я пытаюсь указать в своем форматировщике даты, что строка является GMT, но у меня проблемы, я пробовал следующее, добавляя GMT в формат:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss GMT"];
NSDate *journeyDate = [dateFormatter dateFromString:str];
[dateFormatter release];

Это не работает.

Кто-нибудь может дать какой-нибудь совет?

Решение

Просто резюмирую, я заставил его работать с ужасным обходным путем, добавив GMT к исходной строке и отформатировав это:

NSString * cheat = [NSString stringWithFormat:@"%@ GMT", str];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss zzzz"];
NSDate *journeyDate = [dateFormatter dateFromString:cheat];
[dateFormatter release];
return journeyDate;

Это был своего рода нестабильный хак, потому что, если строка изменится, чтобы включить часовой пояс, она больше не будет работать. Для тех, кому нужно поступить так же, как и я, ниже приводится краткий пример того, как создать NSTimeZone.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *journeyDate = [dateFormatter dateFromString:str];
[dateFormatter release];
return journeyDate;

Спасибо за быструю помощь.


person Daniel    schedule 02.11.2011    source источник


Ответы (2)


Я подозреваю, что вы просто хотите использовать NSDateFormatter.setTimeZone, чтобы принудительно использовать UTC. Вы не хотите изменять строку format, потому что, предположительно, строка не содержит букв «GMT». Вместо этого вы хотите изменить часовой пояс, в котором интерпретируется строка, что и происходит setTimeZone Сделаю.

person Jon Skeet    schedule 02.11.2011

Вы должны использовать метод setTimeZone: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

person Maz    schedule 02.11.2011
comment
упс, не видел другого ответа... мой дубликат - person Maz; 02.11.2011