Почему 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" вернул ноль.
Когда я жестко кодирую одно и то же значение для каждой даты, оно работает при запуске приложения в режиме отладки с моего компьютера.
Что здесь может происходить? Я не покрываю некоторые случаи для NSDate
s? Почему это происходит не на каждом устройстве?
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
когда я работал с китайским парнем. Это случилось только на конкретных устройствах, и проблема была в настройках региона.
Чтобы воспроизвести проблему, выполните следующие действия:
- зайдите в настройки приложения
- Общее -> Язык и регион -> Продвинутый
- Выключить автомат
- изменить язык на
Chinese, Simplified
- снова запустите ваше приложение. Вы обнаружите, что NSDate всегда nil, если NSLocale НЕ установлен.