2015-04-14 2 views
0

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

- (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; 
} 

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

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

Например, я получил сообщение о сбоях, в котором сообщается, что «4/14/2015 7:35 PM» возвращен ноль.

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

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

+1

"4/14/2014" не соответствует "MM/dd/yyyy". «04/14/2014» будет соответствовать. Вам также необходимо установить языковой стандарт «en_US_POSIX». Потребность в этом рассматривается во многих обсуждениях здесь и в документации Apple. – rmaddy

+0

http://stackoverflow.com/questions/6613110/what-is-the-best-way-to-deal-with-the-nsdateformatter-locale-feature –

ответ

2

Во-первых, строка даты 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. Общие -> Язык & Регион -> Advanced
  3. Отключить автоматическое
  4. изменения языка для Chinese, Simplified
  5. выполните свое приложение снова. Вы обнаружите, что NSDate всегда равен нулю, если NSLocale НЕ установлен.
+1

Локаль должен быть «en_US_POSIX», а не просто «en_US ». – rmaddy

+1

@rmaddy благодарит вас за советы. answer updated: D – Joey

+0

Yep - Я смог воспроизвести проблему с вашими предложениями. Единственное, на что я не совсем понимаю (даже после того, как вы отправили документ), является разница между M и MM. Теперь приложение работает сейчас, когда я устанавливаю локаль, независимо от использования MM. – kraftydevil

Смежные вопросы