使用NSDateFormatter解析RFC 822日期

Anu*_*rag 16 iphone parsing date nsdate nsdateformatter

我正在使用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];
}
Run Code Online (Sandbox Code Playgroud)

并解析日期如下:

self.entry.published = [NSDate dateFromRFC822:self.currentString];
Run Code Online (Sandbox Code Playgroud)

一种方法是尝试两种格式,并采取任何返回非空值.但是,规范中有两个可选部分(日期名称和秒),可能有4种可能的组合.仍然不是太糟糕,但它有点hacky.

mmc*_*ole 6

我使用以下方法来解析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;

}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ler 4

在决定使用哪个格式化程序之前计算显着字符的数量。例如,您给出的两个逗号和空格的数量不同。如果没有已知的格式与计数相匹配,那么您甚至不知道尝试将其解析为日期。