【问题标题】:NSDateFormatter.dateFromString is returning null after iOS9 upgradeiOS9 升级后 NSDateFormatter.dateFromString 返回 null
【发布时间】:2015-12-16 09:26:59
【问题描述】:

我的一个应用在刚刚升级到 iOS9 的设备上运行后出现问题(应用的目标是 8.1)。

该应用在 iOS9 之前运行良好,但是,仅在设备上升级到 iOS9 后,出现以下问题。

下面名为“anObsDate”的变量现在返回空值。我不知道为什么。似乎主机设备上 iOS9 的独立升级触发了此问题的发生。

NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]];

当我使用以下调试运行应用程序时,我们有以下输出:

     NSLog(@"Timestamp %@", [anObs timeStamp]);
     NSLog(@"Formatter %@", [self bomDateFormatter]);
     NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]];

Timestamp 2015-09-17 00:01:10
Formatter <NSDateFormatter: 0x7fe7abc653c0>

我将日期格式化程序设置如下:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"];
NSDateFormatter *countDownFormatter = [[NSDateFormatter alloc] init];
[countDownFormatter setLocale:locale];
[countDownFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Melbourne"]];
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss"];
return countDownFormatter;

再次说明这一点,如果我在 iOS9 之前的设备上运行我的应用程序,一切正常,并且 dateFromString 返回一个 NSDate。升级到iOS9后dateFromString返回null。

有什么建议吗?

谢谢。

【问题讨论】:

    标签: ios objective-c cocoa-touch ios9


    【解决方案1】:

    似乎NSDateFormatter 在 iOS 9 中的行为发生了变化,因此日期格式中的单引号字符必须与字符串中的字符完全匹配。以前它会接受任何字符(搜索文档,但找不到任何提及此更改的内容)。

    时间戳字符串缺少以日期格式定义的“T”。尝试将日期格式更改为:

    // Note the "T" has been removed
    [countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss"];
    

    您的另一个选择是将“T”添加到时间戳字符串中:

    // Note the "T" has been added
    2015-09-17T00:01:10
    

    这应该与以前的 iOS 版本向后兼容。

    【讨论】:

    • 正确。我从日期格式中删除了“T”并解决了问题。不过,我不应该期望我需要通过独立的 iOS 更新来做到这一点。
    • 同意。可能值得向 Apple 报告错误。
    • Apple 提醒我,诸如“en_AU”之类的语言环境是面向用户的结构,它们会定期更改。例如,在 1966 年左右的某个时候,en_AU 从使用“£”变为使用“$”。日期格式字符串不能保证在面向用户的语言环境中的稳定性。他们建议使用 en_US_POSIX,它应该是一个永远不会改变的固定语言环境。但是,我上面报告的问题仍然存在于 en_US_POSIX... 当字符串格式化程序和字符串不匹配时返回有效的 NSDate 本身就是一个错误;这似乎已在 iOS9 中修复。
    • 您的代码总是有问题。您的格式字符串中有一个 T,而您的日期中没有。 iOS 9 现在发现了这个错误。
    【解决方案2】:

    这解决了我的问题。你也可以使用它。

    在目标 C 中:

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
    [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    

    在斯威夫特中:

    let dateFormatter = NSDateFormatter()    
    dateFormatter.locale =  NSLocale(localeIdentifier: "en_US_POSIX")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      相关资源
      最近更新 更多