Разбор даты rfc3339 с помощью NSDateFormatter представляется невозможным в общем случае. Я ошибаюсь? [Редактировать 2 года спустя: теперь есть способ! См. Ниже и сноску.]
Не-особенно податливый веб-сервис кормит меня такими датами, как:
2009-12-31T00:00:00-06:00
Rfc3339 совместимый, по умолчанию вывод библиотеки jaxb, которую они используют. Обратите внимание на двоеточие, для которого rfc3339 требуется, когда смещение не является литералом "z":
time-numoffset = ("+" / "-") time-hour ":" time-minute time-offset = "Z" / time-numoffset
Я хочу проанализировать их в NSDates.
NSDateFormatter хочет шаблоны в синтаксисе, указанном Unicode, который предлагает символы поля даты для таких часовых поясов, как "PDT", "-0800", "GMT-08: 00", но не "-08: 00".
Googling и другие подобные вопросы SO вызывают только форматы даты, такие как
[myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"];
/* or: */ [myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
Последний из которых требует буквального "Z" , а первый настаивает либо на отсутствии двоеточия, либо на присутствии "GMT". Тем не менее, они, похоже, работали до ios 4.x(возможно, полностью отбрасывая tz-смещение, мои данные не ясны.)
Мои параметры на данный момент - извините:
- откройте какой-либо недокументированный спецификатор формата или какой-то странный режим, чтобы включить NSDateFormatter, который примет отклоненный двоеточие: longshot, вероятно, несуществующий. [Примечание]
- убедить моего сервисного издателя включить все даты в zulu time и указать "Z" : политически сложно.
- напишите мой собственный подкласс NSFormatter или исследуйте старый добрый
strptime_l
: work.:) - string-манипулировать моим вводом и вырезать последний двоеточие: хрупкий и уродливый, но вероятный путь наименьшего сопротивления.
Я точно понял ситуацию, что текущий NSDateFormatter следует за unicode строго без расширений; и форматы unicode недостаточны для полного описания даты rfc3339?
[FOOTNOTE] Я возвращаюсь к этим трем годам позже, чтобы применить небольшое приложение: Unicode и Apple добавили эту функцию в строки формата, начиная с iOS6/OSX10.8. Сравните Последняя редакция на момент написания статьи с ее ближайшим предшественником, и обратите внимание на добавление 5 "Z" s, что дает формат зоны, например "-08: 00". Поэтому, если вы можете уйти с канавкой поддержки 5.x/10.7, там будет правильный правильный путь. Я оставлю предыдущий стенд для ответа, поскольку он все же лучший подход, когда требуется обратная совместимость.