Использую ли я правильный шаблон формата для анализа даты?

У меня проблема с использованием NSDateFormatter для анализа строки даты. Я реализовал приведенный ниже метод метода как категорию NSDate. Ввод представляет собой следующую строку даты Четверг, 22 декабря 2011 г. 16:03:39 +0100 и использует следующий шаблон для синтаксического анализа EEE, dd MMM yyyy HH:mm:ss ZZZ

Проблема в том, что метод возвращает nil

+(NSDate*) dateFromString:(NSString*)dateString pattern:(NSString*)pattern
{
    NSDateFormatter *dateParser = [[NSDateFormatter alloc] init];
    [dateParser setDateFormat:pattern];

    NSDate *parsedDate = [dateParser dateFromString:dateString];

return parsedDate;
}

Я просмотрел Stackoverflow и другие ресурсы в Интернете, но не нашел решения этой проблемы.


person Johan Karlsson    schedule 22.08.2012    source источник
comment
В чем именно ваша проблема? Вы должны установить локаль средства форматирования даты на [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]   -  person Fabian Kreiser    schedule 22.08.2012
comment
Да, уточните, в чем проблема. И обратите внимание на то, что Фабиан говорит об использовании en_US_POSIX — в iOS есть особенность форматирования времени, если переключатель 12/24 в настройках противоречит локали.   -  person Hot Licks    schedule 22.08.2012
comment
Я пояснил, в чем проблема. Протестировал решение, представленное @FabianKreiser, и оно работает. Однако я не понимаю, почему этот метод работает для парсинга некоторых дат и не работает для других. Я успешно использовал этот код. Может кто-нибудь объяснить, почему?   -  person Johan Karlsson    schedule 22.08.2012
comment
@HotLicks Есть ли простой обходной путь для этой «функции»?   -  person Johan Karlsson    schedule 22.08.2012
comment
Смотрите мой ответ. Я также пытаюсь объяснить, почему NSDateFormatter меняет свое поведение в зависимости от локали.   -  person Fabian Kreiser    schedule 22.08.2012
comment
@FabianKreiser отметил ваш ответ как предпочтительный.   -  person Johan Karlsson    schedule 22.08.2012
comment
да. Как я уже сказал, вы должны делать то, что предложил Фабиан. Вы можете увидеть этот поток для категории, которую вы можете создать, чтобы инкапсулировать настройку локали. Также см. эту ветку для нескольких ссылок, объясняющих проблему Apple.   -  person Hot Licks    schedule 22.08.2012


Ответы (1)


NSDateFormatter довольно умен в настройках региона, таких как отображение часов 12/24, названия месяцев и дней недели и т. д. Если вы инициализируете средство форматирования даты, оно всегда использует текущую локаль, однако вы можете установить локаль вручную. Вы можете использовать идентификатор локали en_US_POSIX, чтобы вернуть средство форматирования даты, которое не учитывает настройки локали и всегда использует одно и то же поведение.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

Это удобно (и на самом деле необходимо), если вам нужно, например, проанализировать строки даты, возвращаемые с сервера.

Если вы хотите отображать строки даты в своем приложении, вы никогда не должны использовать метод -setDateFormat: напрямую, кстати. Используйте метод +dateFormatFromTemplate:options:locale:, чтобы получить правильный формат даты.

В некоторых языках месяц пишется перед днем, ...

    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"dd MMMM yyyy" options:0 locale:[NSLocale currentLocale]];
    [dateFormatter setDateFormat:dateFormat];
person Fabian Kreiser    schedule 22.08.2012