Непоследовательное поведение с NSDateFormatter на двух разных устройствах - PullRequest
12 голосов
/ 11 декабря 2010

У меня небольшая проблема с ошибкой NSDateFormatter на устройстве одного пользователя (возвращает nil при разборе строки) и отлично работает, когда я запускаю его локально (либо в симуляторе, либо на моем устройстве).

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

Вот код:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
[dateFormatter setLocale:locale];
[locale release];

NSDate *theDate = [dateFormatter dateFromString:dateString];
NSLog(@"PARSING DATE %@ AS %@", dateString, theDate);

На неисправном устройстве я получаю:

PARSING DATE 2010-11-28T20:30:49-0000 AS (null)

Но локально я получаю:

PARSING DATE 2010-11-28T20:30:49-0000 AS 2010-11-28 20:30:49 +0000

Это сводит меня с ума, я что-то упускаю?

Я использую 4.2 локально (симулятор) и на моем устройстве (iPhone 4). Неисправным устройством является 3GS под управлением 4.2.1.

Любые идеи будут высоко оценены!

1 Ответ

19 голосов
/ 12 декабря 2010

Я рад сообщить, что в конце концов понял эту проблему, и я должен передать свою благодарность @ bendodson в Твиттере за помощь в этом.aBitObvious также затронул проблему в своем комментарии выше;Я бы проголосовал за него, если бы мог.

Было одно различие между устройством пользователя и моим, и оно состояло в том, что его устройство было настроено на использование 12-часовых часов, а мое - нет.Это означало, что NSDateFormatter не смог разобрать время в приведенных выше примерах и возвратил ноль.

Самой большой проблемой для меня с этой проблемой была неспособность воспроизвести проблему локально!

Итак, чтобы было ясно, решить эту проблему;то есть, если вы анализируете строки даты / времени в известном фиксированном формате (часто исходящем из некоторого API, как это было в моем случае), вы должны установить правильный языковой стандарт для средства форматирования даты, который часто будет en_US_POSIX.

...
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:locale];
[locale release];

Подробнее об этом см. Apple QA1480 .

...