Почему 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;
}

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

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

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

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

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

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

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

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

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

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

  1. зайдите в настройки приложения
  2. Общее -> Язык и регион -> Продвинутый
  3. Выключить автомат
  4. изменить язык на Chinese, Simplified
  5. снова запустите ваше приложение. Вы обнаружите, что NSDate всегда nil, если NSLocale НЕ установлен.
Другие вопросы по тегам