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

NSDateFormatter dateFromString возвращает nil

Вот мой код:

NSString *_date = @"Tue, 23 Nov 2010 16:14:14 +0000";
NSDateFormatter *parser = [[NSDateFormatter alloc] init];
[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss '+0000'"];
[parser setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *date = [parser dateFromString:_date];

Это не работает: "date" установлен в "nil". Я пробовал с помощью

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"];

Без успеха...

Есть ли у вас идеи?

Заранее спасибо

4b9b3361

Ответ 1

Добавьте эту строку:

NSDateFormatter *parser = [[NSDateFormatter alloc] init];
[parser setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];

и он будет работать. По умолчанию NSDateFormatter использует текущую локаль системы, которая может меняться в зависимости от текущих пользовательских настроек. Строка даты выше (@"Tue, 23 Nov 2010 16:14:14 +0000") содержит английские слова ( "Tue", "Sep" ), которые потенциально не будут распознаны форматированием даты, если языковой стандарт будет установлен на что-либо, кроме английского.

Кроме того, пользователи из западных культур могут использовать локали, которые используют другой календарь, чем григорианский календарь, используемый в западном мире. Если вы явно не установили языковой стандарт, форматор даты мог бы анализировать дату, но результирующий NSDate будет представлять собой целый другой момент времени.

Идентификатор локали @"en_US_POSIX" предназначен для этой цели. Он не будет изменяться, даже если локаль @ "en_US" когда-нибудь изменит настройки по умолчанию.

Ответ 2

Спецификатор часового пояса - 'z', поэтому ваша строка должна быть:

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z"];