Как правильно проанализировать дату ISO8601 в какао?

Я хотел бы проанализировать даты ISO8601 в Cocoa, как для iOS 4+, так и для OSX 10.6+.

На StackOverflow уже есть несколько вопросов по этому поводу, но, по моему мнению, ни один из них не содержит хороших ответов. Вот что я думаю, является хорошим ответом:

  1. Ответ должен указывать на код с поддержкой ISO8601. Этот код должен корректно компилироваться в XCode 4 как для iOS 4+, так и для OSX 10.6+.

  2. Код должен поддерживать все возможные форматы даты ISO8601.

    Обратите внимание, что здесь есть много, много возможностей. Просто ответить одной или двумя строками формата для NSDateFormatter не получится.

  3. Ответ должен не быть этой библиотекой. Это потому, что он пронизан опасными 32-битными предположениями, он намного сложнее, чем необходимо, и не компилируется с помощью XCode4/Clang. Итог: вообще не верю!

Спасибо, товарищи какаоисты. Я взволнован, чтобы узнать, есть ли здесь реальный ответ!


person Dave Peck    schedule 01.06.2011    source источник


Ответы (1)


Лучше всего использовать эту библиотеку. ☺

Я должен добавить на эту страницу ссылку на репозиторий Bitbucket, который содержит более новый исходный код (включая 32- bit и исправления Clang!) и имеет средство отслеживания проблем. Если вы найдете какие-либо другие ошибки в нем, пожалуйста, сообщите о них.

Я также хотел бы знать, что вы подразумеваете под «сложнее, чем необходимо». Обычное использование очень просто:

ISO8601DateFormatter *formatter = [[[ISO8601DateFormatter alloc] init] autorelease]; //Or, if you prefer, create it once in -init and own it until -dealloc 
NSDate *parsedDate = [formatter dateFromString:inString];
NSString *unparsedString = [formatter stringFromDate:inDate];

Вы можете отключить dateFromString: или stringFromDate: для одного из более длинных методов, если вам нужна дополнительная информация (например, чтобы сохранить часовой пояс).

Если вы имеете в виду что-то другое, я хочу услышать это, чтобы улучшить библиотеку.

person Peter Hosey    schedule 01.06.2011
comment
Ха! Привет Питер. Отлично, я посмотрю код на Bitbucket и посмотрю, как он работает. Под более сложным, чем необходимо, я должен признать: я имел в виду, что после визуального осмотра я решил, что код вашей библиотеки, вероятно, сложно поддерживать. Мне он не кажется чистым, модульным, хорошо продуманным кодом. Это плюс проблемы с 32/64 убедили меня поискать в другом месте. Тем не менее, ISO8601 - хитрый зверь, как и синтаксические анализаторы ... поэтому я рад, что меня поправили в этом вопросе, возможно, посоветовав мне написать свой собственный проклятый синтаксический анализатор ISO8601. ;-) - person Dave Peck; 01.06.2011
comment
Да, это некрасиво. Каждый из основных методов работы длинный, и есть шесть переходов. В идеале я бы, вероятно, использовал регулярное выражение или три для синтаксического анализа; учитывая, что Cocoa еще не имеет встроенного API регулярных выражений (имеется только Cocoa Touch), если я когда-нибудь решу переписать его для развлечения, я мог бы создать какой-то пользовательский конечный автомат. Тем не менее, как бы то ни было, я считаю более важным переключиться на SenTestingKit для тестирования. Текущий код работает, но я хотел бы, чтобы тестирование и повторное тестирование было проще, прежде чем я рассмотрю возможность замены реализации. (Кстати: make test для запуска текущих тестов.) - person Peter Hosey; 01.06.2011
comment
Сейчас я использую версию этой библиотеки, найденную на Bitbucket. Он компилируется чисто и, судя по моим ограниченным тестам, работает. @Peter, вам следует обязательно обновить свой веб-сайт, чтобы он указывал на битбакет — это поможет людям понять, что ваша библиотека все еще поддерживается. (Как бы то ни было, репозиторий Bitbucket практически невозможно найти.) Если в ближайшие пару дней кто-то не предложит другой ответ на мой вопрос, я отмечу ответ @Peter как принятый! - person Dave Peck; 03.06.2011
comment
@Dave Peck: я обновил страницу, добавив ссылку на Bitbucket. - person Peter Hosey; 04.06.2011
comment
Потрясающий! Я использовал вашу библиотеку в последней тестовой сборке моего приложения Cloak и доволен поведение. Я отмечаю этот ответ как принятый. Еще раз спасибо! - person Dave Peck; 10.06.2011
comment
Эта библиотека кажется несколько ошибочной :-( Поправьте меня, если я ошибаюсь, но я не вижу абсолютно никаких тестов для анализа времени или часового пояса, и это, кажется, области, которые не работают в iOS, когда я использую этот код. Он не генерирует действительные времена ISO8601, и он не будет анализировать их в своей текущей форме. У меня еще нет рабочего патча, но если я его получу, я добавлю еще один комментарий. Я поднял первоначальную ошибку в системе отслеживания проблем. - person Roger; 09.09.2011
comment
В качестве обновления одной проблемой является строка ISO_TIMEZONE_OFFSET_FORMAT. %+02d%02d не дополняет первую цифру нулями, как можно было бы ожидать. Вы можете проверить это с помощью простого NSLog(@%+02d%02d,1,0), который дает +100, а не +0100, как требуется. - person Roger; 09.09.2011
comment
Я думаю, что правильная строка формата должна быть %+.02d%02d, чтобы указать точность и нулевое заполнение, а не нулевое заполнение и ширину поля. - person Roger; 09.09.2011
comment
@Roger: Пожалуйста, обсудите эту ошибку, включая возможные причины, в заявке. - person Peter Hosey; 10.09.2011
comment
Ссылка на билет для всех, кто хочет продолжить или предоставить дополнительную информацию/патч: bitbucket.org/boredzo/iso-8601-parser-unparser/issue/3/ - person Peter Hosey; 10.09.2011
comment
@Roger: я не могу воспроизвести твою проблему. Мне нужна дополнительная информация от вас: bitbucket.org/boredzo/iso-8601-parser-unparser/issue/3/ - person Peter Hosey; 26.09.2011
comment
Кажется, работает правильно. Но я не могу найти документацию о том, как изменить формат выходной строки. :( - person Redfox; 18.01.2012
comment
@Redfox: используйте свойства format, includeTime и timeSeparator. bitbucket.org/boredzo/iso-8601-parser- unparser/src/900c739f57ea/ - person Peter Hosey; 19.01.2012