#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 символов, а затем игнорировать двоеточие? как это обрабатывается с подписью часового пояса? (в частности, вычитание)