Анализ даты 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", "-08:00", "GMT-08:00", но не "-08:00".
Поиск в Google и другие подобные вопросы 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, вероятно, не существует. [сноска]
- убедить моего издателя услуг перевести все даты на зулусское время и указать «Z»: политически сложно.
- напишите свой собственный подкласс NSFormatter или изучите старый добрый
strptime_l
: work. :) - строка-манипулирует моим вводом и удаляет последнее двоеточие: хрупкий и уродливый, но вероятный путь наименьшего сопротивления.
Правильно ли я понял ситуацию, что текущий NSDateFormatter следует за юникодом строго без расширений; и форматов Unicode недостаточно для полного описания даты rfc3339?
[FOOTNOTE] Я вернусь к этому три года спустя, чтобы добавить небольшое дополнение: Unicode и Apple добавили эту функцию в строки формата, начиная с iOS6/OSX10.8. Сравните последнюю версию на момент написания этой статьи с его непосредственный предшественник, и обратите внимание на добавление 5 Z, что дает формат зоны типа "-08:00". Так что, если вам сойдет с рук отказ от поддержки 5.x/10.7, есть новый правильный способ сделать это. Я оставлю предыдущий ответ в силе, так как это все еще лучший подход, когда требуется обратная совместимость.