Я загружаю даты из своего веб-сервиса, я отправляю даты в формате (время по Гринвичу): 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;
Спасибо за быструю помощь.