iOS NSDateFormatter在设备上的行为不同

时间:2015-03-26 12:21:48

标签: ios objective-c nsdateformatter

我有以下代码从NSDate个对象创建NSString个对象。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"hh:mm aa M/dd/yyyy"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
NSString *day = @"3/26/2015";
NSString *time = @"10:24 PM";
NSString *dateString = [NSString stringWithFormat:@"%@ %@", time, day];
NSDate *date = [dateFormatter dateFromString:dateString];

这段代码在模拟器上完美运行,在我的时区产生完全相应的时间。但是,当我在使用iOS 8的设备上运行此功能时,date设置为nil

我使用的格式应该根据此this page引用的Apple Developer page工作。

我们非常感谢您提供的任何帮助或信息。提前谢谢。

编辑:我尝试从格式化的NSString创建NSDate对象,而不是从预定义的格式中获取系统中的日期。这个问题的possible duplicate可能是密切相关的,但我无法在我的情况下找到解决方案。

编辑2 :我刚刚发现只有在“设置”中启用“24小时制”时才会出现此问题。但是,我无法知道设备所有者使用的格式,因此我仍然需要解决方案。

1 个答案:

答案 0 :(得分:3)

使用此类严格的日期格式时,您需要设置区域设置,以避免在格式化日期时遇到设备当前区域设置问题。否则,NSDateFormatter将使用设备的区域设置,这解释了只有在设置中启用24小时时才会发生这种情况。

请参阅Apple's documentation

  

在所有情况下,您都应该考虑格式化程序默认使用与用户首选项设置叠加的用户区域设置(currentLocale)。如果您想使用用户的语言环境但没有各自的设置,您可以从当前用户区域设置(localeIdentifier)获取区域设置ID,并使用该区域设置创建新的"标准“区域设置,然后设置标准locale作为格式化程序locale

例如,在您的情况下,您可以使用en_US_POSIX

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