iOS9升级后,NSDateFormatter.dateFromString返回null

ack*_*ack 8 cocoa-touch objective-c ios ios9

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

该应用程序在iOS9之前正常运行,但是,在仅在设备上升级到iOS9后,会出现以下问题.

下面名为'anObsDate'的变量现在返回null.我不知道为什么.似乎主机设备上的iOS9独立升级已经触发了这个问题.

NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]];
Run Code Online (Sandbox Code Playgroud)

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

     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>
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

再说清楚一点,如果我在iOS9设备上运行我的应用程序,一切正常,dateFromString返回一个NSDate.升级到iOS9后,dateFromString返回null.

有什么建议?

谢谢.

osp*_*spr 6

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

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

// Note the "T" has been removed
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss"];
Run Code Online (Sandbox Code Playgroud)

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

// Note the "T" has been added
2015-09-17T00:01:10
Run Code Online (Sandbox Code Playgroud)

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

  • Apple提醒我,像'en_AU'这样的语言环境是面向用户的结构,它们*会定期更改*.例如,在1966年左右,en_AU从使用"£"变为使用"$".日期格式字符串不保证面向用户的语言环境的稳定性.他们建议使用en_US_POSIX,它应该是一个永不改变的固定语言环境.但是,上面报告的问题仍然存在于en_US_POSIX ...当字符串格式化程序和字符串不匹配时返回有效的NSDate这一事实本身就是一个错误; 似乎已在iOS9修复. (2认同)