iOS9升级后,NSDateFormatter.dateFromString返回null

时间:2015-09-19 07:14:13

标签: ios objective-c cocoa-touch ios9

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

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

下面名为'anObsDate'的变量现在返回null。我不知道为什么。似乎主机设备上的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。

有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分:6)

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

时间戳字符串缺少&#34; T&#34;这是以日期格式定义的。尝试将日期格式更改为:

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

您的另一个选择是添加&#34; T&#34;进入时间戳字符串:

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

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

答案 1 :(得分:3)

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

在目标C中:

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

在斯威夫特:

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