1

当 runDate 值为@“Fri, 01 Nov 2013 08:47:33 GMT-0500”时,我在 iOS 7 iPhone 模拟器上得到 nil,但在 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 模拟器上的实际运行日期为零,但在 iOS 6.1 上没有

如何让它在 iOS 7 上运行?

4

2 回答 2

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”。如果它们是相对于其他时区表达的,那么您必须修复所提供日期的格式,或者可能首先手动解析字符串(使用正则表达式或其他内容提取这些字符),如果你根本做不到。

理想的解决方案是修复提供给客户端的日期格式,但是根据合同优先开发的原则,我们应该尽可能地容忍(假设您需要解析的这个日期是从远程服务中使用的许多下游订户,如果​​格式得到纠正,所有这些都可能必须更改)。

于 2013-11-01T15:41:18.940 回答
1

如果您从尝试解析的字符串中删除 GMT 并让它看起来像这样

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

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

于 2013-11-01T15:30:41.990 回答