Подтвердить что ты не робот

Непоследовательное поведение с NSDateFormatter на двух разных устройствах

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

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

Вот код:

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.

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

4b9b3361

Ответ 1

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

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

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

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

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

Для получения дополнительной информации об этом читайте Apple QA1480.