NSDateFormatter在两个不同设备上的行为不一致

时间:2010-12-11 19:19:13

标签: iphone objective-c nsdateformatter

我遇到一个问题,NSDateFormatter在一个用户的设备上失败(在解析字符串时返回nil)并且当我在本地运行它时(在模拟器或我的设备上)完美地工作。

我试图排除可能导致这种行为不同的原因。我的第一个想法是语言环境,但我已经尝试明确地设置它以确保始终使用相同的语言环境,但它没有任何区别。

以下是代码:

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

这让我发疯,我错过了别的什么吗?

我在本地(模拟器)和我的设备(iPhone 4)上运行4.2。发生故障的设备是运行4.2.1的3GS。

任何想法都会非常感激!

1 个答案:

答案 0 :(得分:19)

我很高兴地说,我最终了解了这个问题,我必须在Twitter上感谢@bendodson帮助我解决这个问题。 aBitObvious也在上面的评论中提到了这个问题;如果可以的话,我会投票给他。

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

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

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

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

有关详细信息,请阅读Apple QA1480