我正在使用NSDateFormatter来解析iPhone上的RFC 822日期。但是,无法在日期格式中指定可选元素。 RFC 822规范中有几个可选部分正在打破日期解析器。如果什么都没有解决,我可能不得不编写一个自定义解析器来遵守规范。使用NSDateFormatter解析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];
一种方法是尝试两种形式ats,并取任何非空值的返回值。但是,规范中有两个可选部分(日期名称和秒数),并且会有4种可能的组合。还不错,但有点不好意思。
这对我来说似乎是最实际的解决方案,因为月份和星期的名称是固定长度,所有其他值都是固定长度的数字。比尝试格式要便宜得多,直到一个作品! – 2009-12-05 23:53:10
实施基本解决方案。不是很满意,但它是迄今为止最好的一个:)逗号表示星期几的存在,两个冒号有助于识别秒数。如果日期中包含对它所遵循的规范的引用,那就太好了,因为日期分析在许多格式的许多语言中都非常麻烦。 – Anurag 2009-12-06 12:29:25