2010-12-11 38 views
12

我在NSDateFormatter在一个用户的设备上失败(在解析一个字符串时返回nil)并且在本地运行时(在模拟器中或在我的设备)。在两个不同的设备上与NSDateFormatter不一致的行为

我想排除什么可能会导致此行为的差异。我的第一个想法是语言环境,但我试着明确地设置它,以确保始终使用相同的区域设置,但它没有区别。

下面是代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

NSDate *theDate = [dateFormatter dateFromString:dateString]; 
NSLog(@"PARSING DATE %@ AS %@", dateString, theDate); 

在发生故障的设备,我得到:

PARSING DATE 2010-11-28T20:30:49-0000 AS (null) 

但本地获得:

PARSING DATE 2010-11-28T20:30:49-0000 AS 2010-11-28 20:30:49 +0000 

这是推动我疯了,我我缺少别的东西?

我运行4.2本地(模拟器)和我的设备(iPhone 4)。失败的设备是运行4.2.1的3GS。

任何想法将不胜感激!

+0

由于您明确设置了格式字符串,您是否尝试删除区域设置代码? – Costique 2010-12-11 19:24:33

+0

设备是否打开了“24小时制”设置?有关更多信息,请参阅[Apple QA1480](http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html)。 – Anna 2010-12-11 23:05:13

+0

是的,我已经尝试过,没有像上面那样设置区域设置。 – 2010-12-12 00:17:59

回答

18

我很高兴地说,我最终得到了这个问题的底部,我必须通过我的感谢@bendodson在Twitter上帮助我与此。 aBitObvious在他上面的评论中也遇到了这个问题;如果可以的话,我已经投了票。

用户设备和我的设备之间有一个区别,那就是他的设备设置为使用12小时制,而我的设备不是。这一件事意味着NSDateFormatter无法解析上述示例中的时间并返回nil。

到目前为止,我对这个问题最大的问题是无法在本地重现问题!

所以,要清楚,要解决这个问题;也就是说,如果您正在解析日期/时间字符串,这些日期/时间字符串是已知的固定格式(通常来自某些API,因为这是我的情况),您应该为日期格式化程序设置正确的语言环境,这通常是en_US_POSIX。

... 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

欲了解更多信息,请阅读Apple QA1480

+1

谢谢 - 修复了一整天都在困扰我的bug! – 2011-11-14 15:59:31

+0

卢克,你是我的英雄! – 2013-08-15 11:51:28

+0

Gazillion upvotes。谢谢(不幸的是,我只能给1) – 2013-12-27 15:26:07

相关问题