Часовой пояс добавлен в час после использования nsdateformatter

#iphone #timezone #nsdate #nsdateformatter

#iPhone #Часовой пояс #nsdate #nsdateformatter

Вопрос:

Я пытаюсь преобразовать строковую дату (2011-06-08T08:05:00.000-08:00) в NSDate, используя следующий код:

 NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
//Translate 2011-06-08T08:05:00.000-08:00 into 2011-06-08T08:05:00.000-0800
stringDate = [stringDate stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([aDate length] - 5, 5)];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSZZZ"];  
NSDate *dateFromString = [dateFormatter dateFromString:stringDate];
  

На данный момент dateFromString равен 2011-06-08 16:05:00 0000. На самом деле я хотел, чтобы dateFromString был равен 2011-06-08 08:05:00 -0800. Что я делаю не так?

Спасибо!

Комментарии:

1. Кроме того, вам, вероятно, нужно установить часовой пояс для вывода на -0800 GMT.

2. К сожалению, ссылка не помогает. Что касается часового пояса, я уже пробовал использовать [DateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:time_zone]]; с временной зоной, равной UTC или GMT, но ничего не изменилось.

3. GMT равен 0000, правильно? Итак, это сработало.

4. Ну, мне нужно, чтобы часовой пояс соответствовал часовому поясу из stringDate, и я не знаю этот часовой пояс заранее.

5. Я пытался использовать [DateFormatter setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]] но это не имело никакого значения. Если вы точно знаете, что делать, пожалуйста, дайте мне знать. Я работаю над этим уже некоторое время, но не могу разобраться.

Ответ №1:

Таким образом, на этот вопрос не будет прямого ответа, и предполагается, что ваш формат строки будет таким же. Что мы собираемся извлечь часть часового пояса (последние 5 символов), а затем вычислить, на сколько секунд мы отклонены от GMT. NSTimeZone есть удобный метод timeZoneForSecondsFromGMT: , который поможет нам получить то, что нам нужно. Это то, что вам нужно добавить к коду в вопросе.

 NSString * zoneString = [stringDate substringFromIndex:([stringDate length] - 5)];
NSTimeInterval timeInterval = [[zoneString substringToIndex:3] intValue] * 3600;
timeInterval  = [[zoneString substringFromIndex:3] intValue] * 60;

NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:timeInterval]];
[formatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss ZZZ"];
NSLog(@"%@", [formatter stringFromDate:dateFromString]);
  

Надеюсь, это поможет вам. Если вы уже нашли лучший ответ, дайте нам знать.

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

 NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]];
[formatter setTimeStyle:NSDateFormatterFullStyle];
[formatter setDateStyle:NSDateFormatterFullStyle];
NSLog(@"%@", [formatter stringFromDate:[NSDate date]]);
  

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

Комментарии:

1. Спасибо за ответ. Проблема заключается в предположении, что часовой пояс равен PST. Нет способа узнать это заранее. Я попытался использовать strptime_l, как указано в developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual / … , но формат, который я предоставляю, просто не работает.

2. согласно вопросу, не следует ли при этом извлекать последние 6 символов, а затем игнорировать двоеточие? как это обрабатывается с подписью часового пояса? (в частности, вычитание)