gpt4 book ai didi

iphone - 使用 NSDateFormatter 解析 RFC 822 日期

转载 作者:行者123 更新时间:2023-12-03 18:22:45 24 4
gpt4 key购买 nike

我正在使用 NSDateFormatter 解析 iPhone 上的 RFC 822 日期。但是,无法以日期格式指定可选元素。 RFC 822 规范中有几个可选部分破坏了日期解析器。如果没有任何效果,我可能必须编写一个自定义解析器来遵守规范。

例如,日期名称在规范中是可选的。所以这两个日期都是有效的:

Tue, 01 Dec 2009 08:48:25 +0000 解析格式为 EEE, dd MMM yyyy HH:mm:ss z01 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 种可能的组合。还不错,但有点老套。

最佳答案

我用过 following method解析 RFC822 日期。我相信它最初来自MWFeedParser :

+ (NSDate *)dateFromRFC822String:(NSString *)dateString {

// Create date formatter
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter) {
NSLocale *en_US_POSIX = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:en_US_POSIX];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[en_US_POSIX release];
}

// Process
NSDate *date = nil;
NSString *RFC822String = [[NSString stringWithString:dateString] uppercaseString];
if ([RFC822String rangeOfString:@","].location != NSNotFound) {
if (!date) { // Sun, 19 May 2002 15:21:36 GMT
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // Sun, 19 May 2002 15:21 GMT
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // Sun, 19 May 2002 15:21:36
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // Sun, 19 May 2002 15:21
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm"];
date = [dateFormatter dateFromString:RFC822String];
}
} else {
if (!date) { // 19 May 2002 15:21:36 GMT
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm:ss zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // 19 May 2002 15:21 GMT
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm zzz"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // 19 May 2002 15:21:36
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm:ss"];
date = [dateFormatter dateFromString:RFC822String];
}
if (!date) { // 19 May 2002 15:21
[dateFormatter setDateFormat:@"d MMM yyyy HH:mm"];
date = [dateFormatter dateFromString:RFC822String];
}
}
if (!date) NSLog(@"Could not parse RFC822 date: \"%@\" Possibly invalid format.", dateString);
return date;

}

关于iphone - 使用 NSDateFormatter 解析 RFC 822 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1850824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com