Разбор неподдерживаемых форматов даты в NSDate какао

С помощью структуры Какао, как я могу преобразовать @ "2008-12-29T00: 27: 42-08: 00" в объект NSDate? Стандартному -dateWithString: это не нравится.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
0
7 820
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вам нужно обрабатывать только формат ISO 8601 (примером которого является эта строка), вы можете попробовать мой анализатор и разборщик ISO 8601.

Возможно, если бы код был лицензирован MIT или Apache 2.0. BSD не подходит для использования с приложениями для iPhone из-за пункта об атрибуции, поскольку большинство приложений фактически не распространяют документацию с двоичным файлом.

Bob Aman 21.06.2010 05:56
Ответ принят как подходящий

Вы можете использовать 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 для добавления ссылки на шаблоны формата даты в Юникоде. Давно искал что-то подобное.

rein 23.07.2009 01:40

Я не смог бы заставить это работать, если бы не процитировал Z так [dateFormatter setDateFormat: @ "yyyy-MM-dd'T'HH: mm: ss'Z '"];

Kaom Te 25.03.2010 15:10

Это приведет к неправильному результату, если пользователь установил AM / PM на своем iPhone - будет добавлен маркер AM / PM. Кроме того, если пользователь использует японский императорский календарь, вы получите год в этом календаре, а не в григорианском календаре. Чтобы получить это право, вам необходимо явно установить языковой стандарт и календарь в средстве форматирования даты.

DenNukem 31.05.2011 06:22

Я не могу заставить это работать для строк, отформатированных, как пример в вопросе, который, по всей видимости, имеет формат RFC 3339, но с двоеточием в смещении часового пояса (оканчивается на -08: 00). Технический стандарт Unicode, который вы связали в черновике # 4, теперь доработан до черновика # 10, и обработка Z немного изменилась - теперь он принимается до 4 раз, и есть новое Приложение J - но ни в коем случае это не так. принять формат "-08: 00". «GMT-08: 00» - да, и «-0800» - да, но не с двоеточием и без GMT. Мне нужно было разобрать такое свидание, и в отчаянии я вырвал двоеточие перед разбором.

metamatt 26.11.2011 12:22

@metamatt Я застрял в той же проблеме. Если бы я не видел этот пост раньше, сэкономил бы около часа :( Удалось ли тебе найти лучшее решение, чем отрывание двоеточия?

Shyam Bhat 20.07.2012 18:18

@shyam Нет, я пошел дальше и оставил это хакерское решение.

metamatt 20.07.2012 20:39

На самом деле вам нужно установить часовой пояс, календарь и языковой стандарт. Если вы не устанавливаете языковой стандарт, у пользователя включено время 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];

Другие вопросы по теме