如何确定收到的日期格式?

时间:2013-07-19 15:55:02

标签: cocoa parsing nsdateformatter date-parsing

在处理从各种客户端发送的各种JSON数据时,日期格式标准化是一个真正的问题。

我可能会得到以下任何一个: 2013年10月5日
13年2月6日
2013年7月13日星期一

有时会有小时,分钟和秒以及时区信息。对于每个客户端,我不得不手动设置NSDateFormatter,或者如果无法解析它我已经完成了子串搜索。我真正想做的是将所有这些组合成一个单一的方法,并以某种方式确定我正在处理的类型。然后有一些switch语句来处理特定日期的解析。

我无法更改格式,但我怎样才能更好地处理它们?

2 个答案:

答案 0 :(得分:1)

这不是你问题的答案,但是当我想要解析日期而不确定格式时,我通常只为NSDataDetector设置日期。检测器通常会检测多种语言的日期并一次格式化。它非常整洁。

答案 1 :(得分:0)

感谢您的评论。我最终要做的是http://waracle.net/iphone-nsdateformatter-date-formatting-table/并非常仔细地研究所有NSDateFormatter选项。特别是在RSS帖子的末尾是时区+0000,这搞乱了我的格式转换。 RSS日期符合RFC 822 ,这意味着您需要在最后使用THREE Z来正确捕获它。

我正在尝试+ ZZZZ这样的字符串失败。这就是我之前修剪琴弦的原因。最终工作的是:

@“2013年7月17日星期三03:23:18 +0000”

需要格式化:

@“EEE,dd MMM yyyy HH:mm:ss ZZZ”

在为这种情况正确设置DateFormatter后,我很容易找出其他格式的其他格式。事实证明,项目中只使用了3种不同的日期格式,我可以轻松地在每个数据源旁边存储正确的日期格式字符串,并在需要时将其插入日期格式化程序。不再需要字符串搜索,所有数据都干净利落地转换为正确的NSDate。

所以答案是,制作一个转换各种日期格式的示例项目,插入您需要的日期格式并正确使用DateFormatter代码。机会是你的日期问题没有你想象的那么糟糕,更好地了解它们可以使代码更清晰。

如果您的格式字符串不正确,请使用下面的示例,您将看到(null)。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSArray *dateStrings = @[
             // From data source 1.
            @[@"2012-04-18",@"yyyy-MM-dd"],
            //  From data source 2.
            @[@"2012-04-19 18:29:35",@"yyyy-MM-dd HH:mm:ss"],
            @[@"2011-05-04 11:10:50",@"yyyy-MM-dd HH:mm:ss"],
            // From RSS feeds (pubDate)
            @[@"Wed, 17 Jul 2013 02:24:23 +0000",@"EEE, dd MMM yyyy HH:mm:ss ZZZ"],
            @[@"Tue, 25 Jun 2013 15:04:49 +0000",@"EEE, dd MMM yyyy HH:mm:ss ZZZ"]
                                 ];
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        for(NSArray *datePair in dateStrings){
            [formatter setDateFormat:datePair[1]];
            NSDate *thisDate = [formatter dateFromString:datePair[0]];
            [formatter setDateStyle:NSDateFormatterMediumStyle];
            NSLog(@"%@ = %@",datePair[0],[formatter stringFromDate:thisDate]);
        }

    }
    return 0;
}