Почему NSFormatter dateFromString иногда возвращает ноль?

У меня есть метод преобразования строки в определенном формате в NSDate, но иногда он возвращает ноль.

- (NSDate *)dateFromString:(NSString *)dateAndTime
{
    NSDate *date;

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"MM/dd/yyyy hh:mm a"];

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [formatter setTimeZone:gmt];

    date = [formatter dateFromString:dateAndTime];

    return date;
}

Это работает большую часть времени, насколько я могу судить, но есть процент времени, когда это не удается.

Я некоторое время отслеживал эту ошибку, поэтому есть некоторый код, который приводит к сбою приложения, когда это происходит. Отчеты о сбоях сообщают мне значения, из-за которых метод возвращал nil.

Например, я получил отчет о сбое, в котором говорилось, что «14.04.2015, 19:35» вернул ноль.

Когда я жестко задаю одно и то же значение для каждой даты, оно работает при запуске приложения в режиме отладки с моего компьютера.

Что здесь может происходить? Я не покрываю некоторые случаи для NSDates? Почему это не происходит на каждом устройстве?


person kraftydevil    schedule 14.04.2015    source источник
comment
14.04.2014 не соответствует дд/мм/гггг. 14.04.2014 подойдет. Вам также необходимо установить локаль en_US_POSIX. Необходимость этого рассматривается во многих дискуссиях здесь и в документации Apple.   -  person rmaddy    schedule 15.04.2015
comment
stackoverflow.com/questions/6613110/   -  person Hot Licks    schedule 15.04.2015


Ответы (1)


Во-первых, строка даты 4/14/2015 7:35 PM может быть M/d/yyyy h:m a или M/dd/yyyy h:mm a. http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns

Во-вторых, рекомендуется установить для NSLocale значение NSDateFormatter.

formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];

У меня была такая же проблема, когда NSDate был установлен nil, когда я работал с китайцем. Это происходило только на определенных устройствах, и проблема заключалась в настройках региона.

Чтобы воспроизвести проблему, выполните следующие действия:

  1. перейдите в приложение «Настройки»
  2. Общие -> Язык и регион -> Дополнительно
  3. Выключить автоматически
  4. изменить язык на Chinese, Simplified
  5. снова запустите ваше приложение. Вы обнаружите, что NSDate всегда равен нулю, если NSLocale НЕ установлен.
person Joey    schedule 15.04.2015
comment
Локаль должна быть en_US_POSIX, а не просто en_US. - person rmaddy; 15.04.2015
comment
@rmaddy спасибо за совет. ответ обновлен :D - person Joey; 15.04.2015
comment
Да, я смог воспроизвести проблему с вашими предложениями. Единственное, что мне не совсем понятно (даже после опубликованного вами документа), - это разница между M и MM. Приложение, кажется, работает теперь, когда я установил локаль, независимо от использования MM. - person kraftydevil; 16.04.2015