Разбор даты rfc3339 с помощью NSDateFormatter представляется невозможным в общем случае. Я ошибаюсь? [Редактировать 2 года спустя: теперь есть способ! См. Ниже и сноска]Parsing rfc3339 с NSDateFormatter в iOS 4.x и MacOS X 10.6: невозможно?
А, не особенно-податливый веб-сервис кормит меня даты как:
2009-12-31T00:00:00-06:00
Rfc3339 совместимых, выход библиотеки JAXB они используют по умолчанию. Обратите внимание на двоеточие, который rfc3339 требует, если смещение не является буквальным «г»:
time-numoffset = ("+"/"-") time-hour ":" time-minute time-offset = "Z"/time-numoffset
Я хочу, чтобы разобрать их в NSDates.
NSDateFormatter хочет шаблоны в синтаксисе, заданные Unicode, который предлагает символы поля даты для таких часовых поясов, как «PDT», «-0800», «GMT-08: 00», но не «-08: 00».
погуглить, и другие подобные SO вопросы, производит только форматы даты, как
[myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"];
/* or: */ [myDateParser setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
последний из которых требует буквального «Z», и бывший настаивает либо отсутствие толстой кишки или в присутствии " ВРЕМЯ ПО ГРИНВИЧУ". Тем не менее, они появились на работу до Ios 4.х (возможно, отбрасывая TZ смещение полностью, мои данные не ясны.)
Мои варианты на данный момент являются жалким много:
- обнаружить некоторые недокументированный спецификатор формата или какой-то странный режим для включения NSDateFormatter, который примет отклоненный двоеточие: longshot, вероятно, несуществующий. [footnote]
- уговорить моего сервисного издателя включить все даты в zulu time и указать «Z»: политически сложно.
- напишите мой собственный подкласс NSFormatter или изучите старый добрый
strptime_l
: work. :) - string-манипулировать моим входом и полосой последней толстой кишки: хрупкой и уродливой, но вероятным путем наименьшего сопротивления.
Я точно понял ситуацию, что текущий NSDateFormatter следует за Unicode строго без расширений; и форматы unicode недостаточны для полного описания даты rfc3339?
[Сноска] Я вернусь к этому через три года, чтобы лавировать на небольшом добавлении: Unicode и Apple, добавили эту функцию для строк формата, так как из iOS6/OSX10.8. Сравните The latest revision as of this writing с its immediate predecessor и обратите внимание на добавление 5 "Z", что дает формат зоны, например "-08: 00". Поэтому, если вы можете уйти с канавкой поддержки 5.x/10.7, есть новый правильный способ сделать это. Я оставлю предыдущий стенд для ответа, так как это лучший подход, когда требуется обратная совместимость.
Спасибо за указатель - Я посмотрел в его источник, и что вы знаете, вариант 4 (удалить последний двоеточие) - это именно то, что он делает. Поскольку это работает для него, я, вероятно, последую его примеру. – rgeorge 2010-12-02 15:02:02