2009-12-28 79 views

回答

13

我已经想出了一个体面的方式来确定这与我已添加到NSLocale类别的一个小函数。它看起来相当准确,在用几个区域进行测试时没有发现任何问题。

@implementation NSLocale (Misc) 
- (BOOL)timeIs24HourFormat { 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [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 is24Hour = amRange.location == NSNotFound && pmRange.location == NSNotFound; 
    [formatter release]; 
    return is24Hour; 
} 
@end 
1

您使用的是NSDateFormatter类吗?据我所知,它尊重用户所使用的任何区域时间格式设置。

编辑 - 回复:您的评论:

格式化字符串比较可能是正确的做法。

NSDateComponents *midnightComp = [[NSDateComponents alloc] init]; 
[midnightComp setHour:0] 
[midnightComp setMinute:0]; 
NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateStyle:NSDateFormatterNoStyle]; 
[format setTimeStyle:NSDateFormatterShortStyle]; 
BOOL midnightIsZeros = [[[format stringFromDate:[[NSCalendar currentCalendar] dateFromComponents:midnightComp]] substringToIndex:2] isEqualToString:@"00"]; 

[[NSUserDefaults standardUserDefaults] setBool:midnightIsZeros forKey:@"TimeWas24Hour"]; 

运行,作为您的应用程序退出,然后再做一次应用程序启动时,并检查它与存储在默认值:沿着线的东西。

+1

我基本上需要检测自上次加载后该设置是否发生了变化。我可以检测区域设置标识符,但是24小时设置没有这种设置。唯一我能想到的是比较保存的格式化日期字符串,但是时区和夏令时存在问题,可能会导致直接比较问题。 – 2009-12-28 23:34:57

+0

感谢您的加入,但我注意到,几个地区实际上在24小时模式下显示小时数为0。 – 2009-12-29 01:24:18

+0

在这种情况下,抓住上面的前两个字符,并检查它们是“00”还是“0:”。 – 2009-12-29 01:54:13

相关问题