我正在使用 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。