NSDateFormatter“HH”返回在iOS 8设备上午/下午

我现在很难过 我一直很高兴地使用NSDateFormatter没有问题,但今天我注意到,我的一个应用程序给了我一个iPhone的iOS 6加设备与iOS 8.1.3疯狂的结果 – 而它似乎罚款其他设备/模拟器。 看看它有这样的代码:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; [dateFormatter setDateFormat:@"HH"]; NSInteger hour= [[dateFormatter stringFromDate:datetime] integerValue]; 

这样的结果(在设备上)为0-12小时的表示法,因为有一个超出我的理由,如果我在这一点上打印[dateFormatter stringFromDate:datetime],我会得到“下午4点”!

我错过了什么?

编辑:要查看问题,请在手机设置中select一个默认为24小时制的区域,例如“英国”或“法国”。 然后,从设置中禁用“24小时制”。 现在,如果你创build一个NSDateFormatter而不设置它的语言环境,那么“HH”将不起作用。 为了避免这个问题,请设置语言环境(甚至是那个时候的电话号码),比如上面的代码,我们可以添加:

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

任何语言环境都可以工作,甚至en_GB。 这显然是一个bug,而不是某种奇怪的unicode标准表示,因为如果你已经设置了一个默认为12小时的区域,那么“24小时制”滑块不会影响“HH”的工作方式,而if您所在的区域默认为24小时,则设置中的滑块将影响代码的工作方式。