为什么NSDateFormatter在iOS 7上返回nil

时间:2013-11-01 15:18:15

标签: ios iphone objective-c ios7 nsdateformatter

当runDate值为@“星期五,2013年11月1日08:47:33 GMT-0500”时,我在iOS 7 iPhone模拟器上没有,但在iOS 6 iPhone模拟器上没问题

        NSString *runDate = [reportDictionary objectForKey:@"runDate"];

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
        formatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss ZZZ";

        NSDate *actualRunDate = [formatter dateFromString:runDate];

我最终在iOS 7模拟器上使用了一个nil的actualRunDate但在iOS 6.1上却没有

如何让它在iOS 7上运行?

2 个答案:

答案 0 :(得分:3)

啊,我想我知道发生了什么。

根据文档,您可以为格式指定三个“ZZZ”字符:

Fri, 01 Nov 2013 08:47:33 -0500

您可以按以下格式为日期指定四个“ZZZZ”字符:

Fri, 01 Nov 2013 08:47:33 GMT-05:00

请注意GMT小时和分钟之间的冒号字符!

因此,我认为解决方案(如果你不能改变你得到的日期格式)是设置格式化程序如下:

formatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss 'GMT'ZZZ";

。 。这将跳过'GMT'部分,将其视为'ZZZ'格式的日期。

正如@rmaddy的评论所指出的,这个解决方案假定所有日期在时区中都有字母'GMT'。如果它们与其他时区相关,那么你必须修改你提供的日期的格式,或者首先手动解析字符串(用正则表达式或其他东西提取这些字符),如果你根本做不到。

理想的解决方案是修复提供给客户端的日期格式,但是根据契约优先开发的原则,我们应该尽可能宽容(假设您需要这个日期)正在从具有许多下游订阅者的远程服务中消费解析,如果格式被更正,则所有这些订阅者都可能必须更改。

答案 1 :(得分:1)

如果您从正在尝试解析的字符串中删除GMT并使其看起来像这样

@"Fri, 01 Nov 2013 08:47:33 -0500"

返回的日期是正确的。其他一切似乎都很好。