Я использую NSDateFormatter для анализа даты RFC 822 на iPhone. Тем не менее, нет способа указать дополнительные элементы в формате даты. Есть пара дополнительных частей в спецификации RFC 822, которая разбивает синтаксический анализатор даты. Если ничего не получится, мне, вероятно, придется написать собственный парсер, чтобы соответствовать спецификациям.
Например, имя дня является необязательным в спецификации. Таким образом, обе эти даты действительны:
Tue, 01 Dec 2009 08:48:25 +0000
анализируется форматом EEE, dd MMM yyyy HH:mm:ss z
01 Dec 2009 08:48:25 +0000
анализируется форматом dd MMM yyyy HH:mm:ss z
Это то, что я сейчас использую:
+ (NSDateFormatter *)rfc822Formatter {
static NSDateFormatter *formatter = nil;
if (formatter == nil) {
formatter = [[NSDateFormatter alloc] init];
NSLocale *enUS = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[formatter setLocale:enUS];
[enUS release];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z"];
}
return formatter;
}
+ (NSDate *)dateFromRFC822:(NSString *)date {
NSDateFormatter *formatter = [NSDate rfc822Formatter];
return [formatter dateFromString:date];
}
И разбор даты следующим образом:
self.entry.published = [NSDate dateFromRFC822:self.currentString];
Один из способов - попробовать оба формата и взять все возвращаемые значения, отличные от нуля. Однако в спецификации есть две необязательные части (имя дня и секунды), и было бы четыре возможных комбинации. Все еще не так уж плохо, но это немного хаки.