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

DC2*_*DC2 5 cocoa parsing nsdateformatter date-parsing

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

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

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

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

DC2*_*DC2 0

好的,谢谢您的评论。我最终做的是访问http://waracle.net/iphone-nsdateformatter-date-formatting-table/并非常仔细地研究所有 NSDateFormatter 选项。特别是 RSS 帖子末尾的时区 +0000 搞乱了我的格式转换。 RSS 日期与 RFC 822 匹配,这意味着您需要在末尾使用三个 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;
}
Run Code Online (Sandbox Code Playgroud)