NSDateFormatter возвращает нуль в ОС 4.0

У меня был следующий код, работающий на OS 3.x

NSString *stringDate = @"2010-06-21T20:06:36+00:00"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; NSDate *theDate = [dateFormatter dateFromString:stringDate]; NSLog(@"%@",[dateFormatter stringFromDate:theDate]); 

но теперь в новейшем xcode 3.2.3 под iOS4-симулятором varialble theDate равен нулю.

Я просмотрел ссылку на class и не вижу ничего устаревшего или реализованного по-разному для iOS4 с помощью этих конкретных методов. Что я упустил?

Я узнал, что это работает, если вы делаете это так (см. Ниже). Ключ использует метод: - [NSDateFormatter getObjectValue:forString:range:error:]

вместо

-[NSDateFormatter dateFromString]

Полный код:

 + (NSDate *)parseRFC3339Date:(NSString *)dateString { NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init]; [rfc3339TimestampFormatterWithTimeZone setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; NSDate *theDate = nil; NSError *error = nil; if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) { NSLog(@"Date '%@' could not be parsed: %@", dateString, error); } [rfc3339TimestampFormatterWithTimeZone release]; return theDate; } 

Установлено ли ваше устройство на 24 часа или 12 часов?

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

Вы можете заставить его игнорировать их, добавив эту строку:

 dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

Надеюсь, это поможет.

Этот код удалит дополнительный двоеточие, как описано AtomRiot:

Преобразование из:

  • NSString *stringDate = @"2010-06-21T20:06:36+00:00";

чтобы:

  • NSString *stringDate = @"2010-06-21T20:06:36+0000";
 // Remove colon in timezone as iOS 4+ NSDateFormatter breaks if (stringDate.length > 20) { stringDate = [stringDate stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange(20, stringDate.length-20)]; } 

подробнее см .: https://devforums.apple.com/thread/45837

Недавно я столкнулся с этой проблемой. Я закончил работу с синтаксисом ISO8601 Питера Хоуси. Он доступен здесь: http://boredzo.org/iso8601unparser/

Похоже, документация Apple, ну, «сложная»:

Строка формата использует шаблоны формата из стандарта Unicode (эта ссылка относится к версии tr35-6 для Mac OS X v10.5, для Mac OS X версии 10.4 используется версия tr35-4 ).

а также

iOS : Режим совместимости v10.0 недоступен в iOS, только доступен режим 10.4 .

Согласно версии tr35-4 :

Используйте 1 для формата GMT, 2 для RFC 822

Z {1} GMT-08: 00
Z {2} -0800

Но согласно стандарту Unicode :

Используйте одну-три буквы для RFC 822, четыре буквы для формата GMT.

Z {1,3} -0800
Z {4} GMT-08: 00

Таким образом, похоже, что iOS 4 использует tr35-6 – стандарт Unicode, поэтому +00: 00 теперь не работает против «Z».

Я пробовал -08: 00 против «ZZZZ» в моем NSDateFormatter, и он не удался в iOS 4. GMT-08: 00 , однако, работал. Кажется, теперь требуется часовой пояс (GMT), а не факультативный, как это могло быть в iOS 3.

Формат, который мне предоставляется, находится на полпути между RFC 822 и GMT. если я изменил «+00: 00» на «+0000», тогда я могу использовать «Z» в своем формате. и если я изменю его на «GMT + 00: 00», то я смогу использовать ZZZZ для правильного получения данных. Кажется, что что-то было устранено, чтобы справиться с этим гибридом, поскольку он работал для меня раньше с OS 3.x.

Я получаю значение от dataFormat @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'hh:mm" ;

Выглядит хорошо для меня.

Правильно ли он работает на реальном устройстве?

Если это так, сообщите об ошибке для симулятора, в противном случае укажите отчет об ошибке для iOS 4.

Я просто отлаживал эту ту же проблему. У меня такая же строка даты, что и у 3.x, а не 4.0. Те же симптомы.

При просмотре документации NSDateFormatter я вижу:

Инициализация Date Formatter – init Доступен в iPhone OS 2.0 через iPhone OS 3.2

Это говорит о том, что метод init был устаревшим для iOS 4.0. Я не уверен, что это значит.

Ссылка, опубликованная Elfred, сделала трюк. Я наткнулся на ту же проблему, конвертируя свое приложение из 3.1.3 в iOS4. Ссылка содержит class ISO8601DateFormatter, который является гораздо более отличным расширением, чем мой собственный class данных даты.

Elfred писал (а): Недавно я столкнулся с этим вопросом. Я закончил работу с синтаксисом ISO8601 Питера Хоуси. Он доступен здесь: http://boredzo.org/iso8601unparser/

Кажется, NSDateFormatter стал очень parsingчивым.

 -(void)dateFormatterTests { NSDateFormatter *formatter; formatter = [[NSDateFormatter alloc] init]; #ifdef WORKS [formatter setDateFormat:@"yyyy-MM-dd"]; #elif defined(ALSO_WORKS) [formatter setDateFormat:@"yyyy MM dd"]; [formatter setLenient:YES]; #else // DOESN'T WORK [formatter setDateFormat:@"yyyy MM dd"]; #endif // Works per comments above NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13"]); // Never works with any of the above formats NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13 22:00"]); [formatter release]; formatter = nil; } 

У меня была такая же проблема в моих приложениях, как и Null Value из NSDateFormatter .

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

Я отправил свое приложение на такое время и время: 07/16/2010 04:21:00 +00:00 с форматировщиком вот так: [dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss ZZZ"]

Похоже, что ZZZ часть формирования NO LONGER принимает двоеточие: за это время.

Работы: 07/16/2010 04:21:00 +0000

Не работает: 07/16/2010 04:21:00 +00:00

Чтобы поддержать текущие приложения, которые были отключены, все, что я сделал, это поиск в строке +00:00 в строке и замена его на +0000 .

Надеюсь, это может помочь другим.

Я использую его так просто, как:

 date_formatter = [[NSDateFormatter alloc] init]; [date_formatter setDateStyle:NSDateFormatterShortStyle]; [date_formatter setTimeStyle:NSDateFormatterNoStyle]; 

и это отлично работает. Я не понимаю, как они могут отказаться от метода init, когда class NSDateFormatter подclassифицирован из NSObject

  • Преобразование NSString даты в NSDate
  • Форматирование NSDate в определенные стили для года, месяца, дня и часа, минуты, секунд
  • Есть ли простой способ конвертировать метку времени ISO8601 в форматированный NSDate?
  • Формат NSDate, выводящий неверную дату
  • Преобразование ISO 8601 в NSDate
  • Interesting Posts

    Outlook 2010: как автоматически отключить Office при закрытии Outlook?

    Что такое начальный масштаб, пользовательский масштабируемый, минимальный масштаб, атрибут максимальной шкалы в метатеге?

    Иллюстрирование использования ключевого слова volatile в C #

    Как можно добавить разделитель между элементами в ItemsControl

    Есть ли способ включить запятые в столбцы CSV, не нарушая форматирование?

    Сократить число до двух знаков после запятой без округления

    Что эквивалентно окончанию Java в C #?

    Что происходит с запущенными процессами, когда я теряю удаленное соединение с полем * nix?

    Как скопировать часть массива в другой массив в C #?

    Инструмент для аннотирования изображений (скриншоты) для целей документации?

    Как использовать cout << myclass

    Google Chrome Downgrade

    Синхронизировать пароли Firefox и Chrome?

    HTML5: как использовать «обязательный» атрибут с полем «радио»

    Как каталогизировать файлы на нескольких внешних жестких дисках, которые я хочу хранить в автономном режиме?

    Давайте будем гением компьютера.