5

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

我可能会得到以下任何一个:2013-10-05
2-6-13
Mon, Jul 13 2013

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

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

4

2 回答 2

1

这不完全是您问题的答案,但是当我想在不确定格式的情况下解析日期时,我通常只为日期设置 NSDataDetector 。检测器通常会同时检测多种语言和格式的日期。这很整洁。

于 2013-07-19T16:50:18.737 回答
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;
}
于 2013-07-25T17:09:26.540 回答