NSDateFormatter не будет анализировать строку с часовым поясом, который включает двоеточие - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь преобразовать @"Fri, 26 Aug 2011 10:51:00 +02:00" в NSDate:

[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
NSDate *date = [dateFormatter dateFromString:dateString];

В результате я получаю nil;что я делаю не так?

Ответы [ 4 ]

6 голосов
/ 26 апреля 2012

Вы можете использовать getObjectValue: forString: range: error: метод для анализа дат с двоеточием в часовом поясе:

// test date formatting
NSString *dateString = @"2012-04-11T18:34:19+00:00";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *date;
NSError *error;
[formatter getObjectValue:&date forString:dateString range:nil error:&error];
5 голосов
/ 26 августа 2011

Двоеточие в часовом поясе (+02:00) - проблема. Согласно стандарту Unicode # 35 , шаблон заглавной буквы 1..3 обозначает часовой пояс RFC 822 . Часовые пояса RFC 822 представляют смещение от GMT (или UTC) и имеют следующий формат:

zone             =  "UT"  / "GMT"                ; Universal Time
                 ...
                 ...
                 / ( ("+" / "-") 4DIGIT )        ; Local differential
                                                 ;  hours+min. (HHMM)

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

Самое правильное решение - это сначала создать строку даты, соответствующую Юникоду, но если вы застряли в этом формате, вам может потребоваться предварительно обработать строку даты, прежде чем передать ее в NSDateFormatter.

Например, быстрое исправление будет использовать stringByReplacingOccurrencesOfString, чтобы избавиться от двоеточия в часовом поясе:

// dateString --> Fri, 26 Aug 2011 10:51:00 +02:00
dateString = [dateString stringByReplacingOccurrencesOfString:@":" 
                                                   withString:@"" 
                                                      options:0
                                                        range:NSMakeRange(25, [dateString length] - 25)];
// dateString --> Fri, 26 Aug 2011 10:51:00 +0200
[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
NSDate *date = [dateFormatter dateFromString:dateString];
// date --> 2011-08-26 08:51:00 +0000
2 голосов
/ 26 августа 2011

Никаких манипуляций со строками не требуется. Измените строку формата на:

[dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z:00"];

Я проверил его, и он отлично разбирает дату, которую вы даете. Когда я печатаю дату, используя [NSDate description], я получаю 2011-08-26 08:51:00 + 0000 , что эквивалентно дате, указанной в строке.

0 голосов
/ 26 августа 2011

Да, это обычная проблема.Ряд серверов производят дату с двоеточием в часовом поясе, и NSDateFormatter не может (насколько мне известно) принять его.Решение состоит в том, чтобы как-то вырезать толстую кишку.

...