2013-10-08 5 views
0

я форматирование строки даты со следующим кодом:потеря 1 часа после форматирования строки даты

и это формат строка даты: 2013-10-08T20: 30: 00 + 03: 00

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; 
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[dateFormatter setDateFormat:@"EEEE"]; 


NSDateFormatter *formmatter = [[NSDateFormatter alloc] init]; 
formmatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:SSSZZZ"; 
NSString *dataString = [meetingData objectForKey:@"start"]; 
if (![dataString isKindOfClass:[NSNull class]]) { 
    NSMutableString *mutableDate = [dataString mutableCopy]; 
    [mutableDate deleteCharactersInRange:NSMakeRange(mutableDate.length - 3, 1)]; 
    NSDate *gmtDate = [formmatter dateFromString:mutableDate]; 
    NSDateFormatter *HHMM_Fromatter = [[NSDateFormatter alloc] init]; 
    [HHMM_Fromatter setDateFormat:@"HH:mm"]; 
    self.meetingTime = checkTheObject([HHMM_Fromatter stringFromDate:gmtDate]); 
    self.meetingDay = checkTheObject([dateFormatter stringFromDate:gmtDate]); 
} 

выход для self.meetingTime: 19:30 и self.meetingDay прекрасно, почему я теряя 1 час?

ответ

1

Ваши две формы даты HHMM_Fromatter и dateFormatter используют разные локации и, следовательно, разные часовые пояса. Вы должны явно установить часовой пояс обоих форматировщиков в одну и ту же зону (возможно, [NSTimeZone localTimeZone]).

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

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

+0

но я думаю, что +03: 00 (часовой пояс) динамичен и приходит с сервера, как я могу его обработать? –

+0

после установки как en_US найти выход так же –

+0

@orazran Конечно, вам нужно разобрать полную строку времени, которую вы получаете с сервера, включая часовой пояс. Вы должны правильно настроить форматер для анализа части часового пояса. Получаемый «NSDate» всегда будет общим: в этом универсальном представлении точки во времени нет информации о локали. –

Смежные вопросы