40

アプリの現在のデバイスが12時間24時間形式を使用しているかどうかを検出する方法はありますか?ユーザーの言語/場所の設定に応じて、1つのNSDateFormatterを12時間と24時間に使用できますか?UIDatePickerが12時間形式の場合、AM/PMピッカーを検出して表示するのと同じです。

4

6 に答える 6

83

私はそれを理解しました、それはかなり簡単です。このコードを に追加しました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、ロケールに応じて異なります。

于 2011-09-24T10:39:22.803 に答える
3

スイフト 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 に置き換える必要があります。API に渡されるスケルトンで「j」を使用することは、スケルトンがロケールの優先時間サイクル タイプ (12 時間または 24 時間) を要求する唯一の方法であることに注意してください。

この最後の文は重要です。これは、「スケルトンにロケールの優先タイム サイクル タイプを要求させる唯一の方法です」。NSDateFormatter と NSCalendar は ICU ライブラリ上に構築されているため、ここでも同じことが言えます。

https://stackoverflow.com/a/11660380/3428146から収集

于 2020-10-26T17:58:25.653 に答える
2

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)
}
于 2016-09-27T14:41:30.043 に答える