NSDateFormatter的时间不会根据手机设置而改变

这一个是杀了我,我有以下date格式化程序:

+ (NSDateFormatter *)dateFormatter { static NSDateFormatter *_dateFormatter = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSString *format = [NSDateFormatter dateFormatFromTemplate:@"hh:mm a" options:0 locale:[NSLocale currentLocale]]; _dateFormatter = [[NSDateFormatter alloc] init]; [_dateFormatter setDateFormat:format]; }); return _dateFormatter; } 

我想根据用户时钟设置的最后一小时格式,所以如果用户使用“24小时制”,结果应该是例如:

 19:41 

否则结果应该是

 7:41 PM 

现在确定“杀死我”部分,如果将​​手机的“地区格式”设置为“美国”,这似乎很有用。
如果我打开/closures“24小时制”,则确实从19:417:41 PM变化

但是如果我把“地区格式”设置为与“美国”不同的地方,例如“西class牙”,那么无论我是否打开/closures“24小时制”,我总是得到7:41 pm

更奇怪的是,如果我使用以下模板:

 @"HH:mm a" (changed hh to uppercase HH) 

现在'西class牙'工作很好,根据“24小时制”的设置而改变,但是现在'美国'总是24小时制,无论我是否在设置中closures!

这里发生了什么?!

请考虑它对我使用dateFormatFromTemplate而不是常规格式很重要。

试试这个代码

 NSDate *time; if ([objShare checkTimeFormat]){ [timeFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];; [timeFormat setDateFormat:@"hh:mm a"]; NSLog(@"%@",lblVtime.text); time = [timeFormat dateFromString:lblVtime.text]; } else{ NSLog(@"%@",lblVtime.text); [timeFormat setDateFormat:@"hh:mm a"]; time = [timeFormat dateFromString:lblVtime.text]; } [timeFormat setDateFormat:@"HH:mm"]; NSLog(@"%@",[timeFormat stringFromDate:time]); 

让我知道你是否有任何疑问

checkTimeFormat方法:

 -(BOOL)checkTimeFormat{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setLocale:[NSLocale currentLocale]]; [formatter setDateStyle:NSDateFormatterNoStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; NSString *dateString = [formatter stringFromDate:[NSDate date]]; NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]]; NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]]; BOOL is24h = (amRange.location == NSNotFound && pmRange.location == NSNotFound); return is24h; }