如何确定iPhone是否设置为12小时或24小时时间显示?

pro*_*rmr 41 iphone datetime localization

我以为我最近在SO上看到了回答这个问题,但现在我找不到了.这是我现在使用的代码,用于确定设置是否为24小时时间显示.它适用于我在美国,但我不知道它是否适用于所有语言环境.这是否足够或是否有更好的方法来找出当前的设置?

+(BOOL) use24HourClock
{
    BOOL using24HourClock = NO;

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];    
    [dateFormatter setLocale: [NSLocale currentLocale]];    
    [dateFormatter setDateStyle:kCFDateFormatterNoStyle];
    [dateFormatter setTimeStyle:kCFDateFormatterShortStyle];    
    // get date/time (1Jan2001 0000UTC)
    NSDate* midnight = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:0];   
    NSString* dateString = [dateFormatter stringFromDate: midnight];
    // dateString will either be "15:00" or "16:00" (depending on DST) or
    // it will be "4:00 PM" or "3:00 PM" (depending on DST)
    using24HourClock = ([dateString length] == 5);
    [midnight release];
    [dateFormatter release];    

    return using24HourClock;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ong 84

这是最好的方法:

NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];

NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL hasAMPM = containsA.location != NSNotFound;
Run Code Online (Sandbox Code Playgroud)

在斯威夫特:

let formatString: NSString = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.currentLocale())!
let hasAMPM = formatString.containsString("a")
Run Code Online (Sandbox Code Playgroud)

斯威夫特4:

let formatString = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!
let hasAMPM = formatString.contains("a")
Run Code Online (Sandbox Code Playgroud)

这使用名为"j"的特殊日期模板字符串.根据ICU规范,"j"......

请求区域设置(h,H,K或k)的首选小时格式,由h,H,K或k是否以区域设置的标准短时间格式使用来确定.在这种API的实现中,在开始与availableFormats数据匹配之前,'j'必须被h,H,K或k替换.请注意,在传递给API的框架中使用"j"是使框架请求区域设置的首选时间周期类型(12小时或24小时)的唯一方法.

最后一句很重要.它"是骨架请求区域设置首选时间周期类型的唯一方法".既然NSDateFormatter并且NSCalendar建立在ICU库上,这同样适用.

  • @Wienke"a"是AM/PM指示符的ICU符号.它不可能是"A",因为ICU使用"A"来表示完全不同的东西(一天中的毫秒). (4认同)
  • 在阅读@iOSX 评论后进一步查看了 ICU 规范 - 发现这段话“12 小时与 24 小时对区域设置的偏好可以从时间数据中得出。如果小时符号是“h”或“K”那么格式为 12 小时;否则为 24 小时。” 可能是更安全的检查? (2认同)

Mic*_*all 22

我刚刚在这里问了一个类似的问题,我已经设法找到了一个很好的方法来确定这一点,我已经添加了一个类别的函数NSLocale.它看起来非常准确,并且在测试多个地区时没有发现任何问题.

@implementation NSLocale (Misc)
- (BOOL)timeIs24HourFormat {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setLocale:self];
    [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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


iOS*_*OSX 8

我给了戴夫的答案,但是当用德语语言环境测试时 - 一个使用24小时时间周期的区域 - 我意识到在格式字符串而不是a中检查Hk会更好,并且引用的子字符串应该是忽略.

对于德语语言环境,我在iOS模拟器中请求模板"j"的日期格式时返回"HH a",并在设备上请求"HH'Uhr'".(不明白为什么会有所不同.)

这是NSLocale我用来检查24小时时间周期的类别:

@interface NSLocale (TwentyFourHourTimeCycleCheck)

- (BOOL)uses24HourTimeCycle;

@end

@implementation NSLocale (TwentyFourHourTimeCycleCheck)

- (BOOL)uses24HourTimeCycle
{
    BOOL uses24HourTimeCycle = NO;

    NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:self];
    NSScanner *symbolScanner = [NSScanner scannerWithString:formatStringForHours];

    NSString *singleQuoteCharacterString = @"'";

    // look for single quote characters, ignore those and the enclosed strings
    while ( ![symbolScanner isAtEnd] ) {

        NSString *scannedString = @"";
        [symbolScanner scanUpToString:singleQuoteCharacterString intoString:&scannedString];

        // if 'H' or 'k' is found the locale uses 24 hour time cycle, and we can stop scanning
        if ( [scannedString rangeOfString:@"H"].location != NSNotFound ||
             [scannedString rangeOfString:@"k"].location != NSNotFound ) {

            uses24HourTimeCycle = YES;

            break;
        }

        // skip the single quote
        [symbolScanner scanString:singleQuoteCharacterString intoString:NULL];
        // skip everything up to and including the next single quote
        [symbolScanner scanUpToString:singleQuoteCharacterString intoString:NULL];
        [symbolScanner scanString:singleQuoteCharacterString intoString:NULL];
    }

    return uses24HourTimeCycle;
}

@end
Run Code Online (Sandbox Code Playgroud)

  • 感谢您分享这一点,在德国语言环境中,当采用 24 小时制时,它确实会显示“HH 'Uhr”。因此,我们提出了一种可能性,即某些语言可能会返回包含“a”的内容,即使是 24 小时格式,对吧? (2认同)