Определить, если формат времени в 12-часовом или 24-часовом формате

Есть ли способ определить, использует ли текущее устройство приложения 12h в нашем 24-часовом формате, чтобы я мог использовать один NSDateFormatter в течение 12 часов и один в течение 24 часов в зависимости от настроек языка / языка пользователя? Так же, как UIDatePicker обнаруживает и показывает AM/PM, если это 12-часовой формат.

5 ответов

Решение

Я понял это довольно легко. Я только что добавил этот код в viewDidLoad:

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);
[formatter release];
NSLog(@"%@\n",(is24h ? @"YES" : @"NO"));

И это прекрасно возвращает YES или же NO в зависимости от локали.

И вот обновленная версия Swift 3.0

func using12hClockFormat() -> Bool {

    let formatter = DateFormatter()
    formatter.locale = Locale.current
    formatter.dateStyle = .none
    formatter.timeStyle = .short

    let dateString = formatter.string(from: Date())
    let amRange = dateString.range(of: formatter.amSymbol)
    let pmRange = dateString.range(of: formatter.pmSymbol)

    return !(pmRange == nil && amRange == nil)
}

Это быстрое решение, которое сработало для меня, те два выше не сработали.

 let dateString: String = DateFormatter.dateFormat (fromTemplate: "j", параметры: 0, языковой стандарт: Locale.current)!

if(dateString.contains("a")){ // 12 h format return true }else{ // 24 h format return false }

Для Swift 5.3. Протестировано на Xcode 12.

func is12hClockFormat() -> Bool {
    let formatString = DateFormatter.dateFormat(
        fromTemplate: "j",
        options: 0,
        locale: Locale.current
    )!
    return formatString.contains("a")
}

При этом используется специальная строка шаблона даты под названием "j". Согласно спецификации ICU, "j"...

запрашивает предпочтительный формат часов для языкового стандарта (h, H, K или k) в зависимости от того, используется ли h, H, K или k в стандартном коротком формате времени для данного языкового стандарта. В реализации такого API перед началом сопоставления с данными availableFormats необходимо заменить j на h, H, K или k. Обратите внимание, что использование "j" в скелете, передаваемом в API, - единственный способ заставить скелет запрашивать предпочтительный тип временного цикла языкового стандарта (12-часовой или 24-часовой).

Последнее предложение очень важно. Это "единственный способ заставить скелет запросить предпочтительный тип временного цикла локали". Поскольку NSDateFormatter и NSCalendar построены на библиотеке ICU, здесь то же самое.

Собрано с /questions/10621236/kak-opredelit-nastroen-li-iphone-na-12-chasovoj-ili-24-chasovoj-displej/10621245#10621245

Вот версия Swift:

func using12hClockFormat() -> Bool {

    let formatter = NSDateFormatter()
    formatter.locale = NSLocale.currentLocale()
    formatter.dateStyle = NSDateFormatterStyle.NoStyle
    formatter.timeStyle = NSDateFormatterStyle.ShortStyle

    let dateString = formatter.stringFromDate(NSDate())
    let amRange = dateString.rangeOfString(formatter.AMSymbol)
    let pmRange = dateString.rangeOfString(formatter.PMSymbol)

    return !(pmRange == nil && amRange == nil)
}

Цель C категория NSDate+Extensions:

@import Foundation;

@interface NSDate (Extensions)

- (NSString *)getTimeString;

@end


#import "NSDate+Extensions.h"

@implementation NSDate (Extensions)

- (NSString *)getTimeString
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    if ([self isTwelveHourDateFormat]) {
        [formatter setDateFormat:@"hh:mm\ndd MMM"];
    }
    else {
        [formatter setDateFormat:@"HH:mm\ndd MMM"];
    }
    return [formatter stringFromDate:self];
}

- (BOOL)isTwelveHourDateFormat
{
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
    return [dateFormat containsString:@"a"];
}

@end
Другие вопросы по тегам