我正在使用NSDateFormatter来解析iPhone上的RFC 822日期。然而,在日期格式中没有办法指定可选元素。在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];
一种方法是尝试使用两种格式,然后取非空值。但是,规范中有两个可选部分(星期几和秒),因此会有4种可能的组合。虽然还不算太糟糕,但有点 hacky。