




Если вам нужно обрабатывать только формат ISO 8601 (примером которого является эта строка), вы можете попробовать мой анализатор и разборщик ISO 8601.
Вы можете использовать NSDateFormatter для анализа дат:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
date = [dateFormatter dateFromString:dateStr];
шаблоны формата даты в Юникоде определяет строку формата, которую вы можете использовать с методом setDateFormat:.
Обратите внимание: если вы нацеливаетесь на 10.4, вам необходимо вызвать: [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];. Не требуется для iphone или leopard, так как там этот режим установлен по умолчанию.
+1 для добавления ссылки на шаблоны формата даты в Юникоде. Давно искал что-то подобное.
Я не смог бы заставить это работать, если бы не процитировал Z так [dateFormatter setDateFormat: @ "yyyy-MM-dd'T'HH: mm: ss'Z '"];
Это приведет к неправильному результату, если пользователь установил AM / PM на своем iPhone - будет добавлен маркер AM / PM. Кроме того, если пользователь использует японский императорский календарь, вы получите год в этом календаре, а не в григорианском календаре. Чтобы получить это право, вам необходимо явно установить языковой стандарт и календарь в средстве форматирования даты.
Я не могу заставить это работать для строк, отформатированных, как пример в вопросе, который, по всей видимости, имеет формат RFC 3339, но с двоеточием в смещении часового пояса (оканчивается на -08: 00). Технический стандарт Unicode, который вы связали в черновике # 4, теперь доработан до черновика # 10, и обработка Z немного изменилась - теперь он принимается до 4 раз, и есть новое Приложение J - но ни в коем случае это не так. принять формат "-08: 00". «GMT-08: 00» - да, и «-0800» - да, но не с двоеточием и без GMT. Мне нужно было разобрать такое свидание, и в отчаянии я вырвал двоеточие перед разбором.
@metamatt Я застрял в той же проблеме. Если бы я не видел этот пост раньше, сэкономил бы около часа :( Удалось ли тебе найти лучшее решение, чем отрывание двоеточия?
@shyam Нет, я пошел дальше и оставил это хакерское решение.
На самом деле вам нужно установить часовой пояс, календарь и языковой стандарт. Если вы не устанавливаете языковой стандарт, у пользователя включено время AM / PM, модуль форматирования добавит маркер AM / PM! Если вы не установите часовой пояс, он будет использовать текущий часовой пояс, но пометит его как «Z» («Zulu» или GMT). Если вы не установите календарь, пользователи с японским императорским календарем будут иметь количество лет с момента вознесения текущего императора, а не количество лет с момента рождения Иисуса Христа. Обязательно протестируйте во всех упомянутых мною сценариях!
NSDateFormatter * f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSString * str = [f stringFromDate:someDate];
NSDate * date = [f dateFromString:dateStr];
Изменение часового пояса с ios 5 на ios 6. iOS 6 поддерживает формат +01: 00 с использованием ZZZZZ, а ios 5 - нет. Я решил эту проблему с помощью этого решения, которое помогло мне проанализировать дату в следующем формате в iOS 5 и 6.
2013-05-07T00: 00: 00 + 01: 00
NSMutableString *newDate = [date mutableCopy];
NSRange range;
range.location = 22;
range.length = 1;
[newDate replaceCharactersInRange:range withString:@""];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZ"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:newDate];
Возможно, если бы код был лицензирован MIT или Apache 2.0. BSD не подходит для использования с приложениями для iPhone из-за пункта об атрибуции, поскольку большинство приложений фактически не распространяют документацию с двоичным файлом.