8

UIDatePickerを使用して時間を選択しています。ピッカーの背景もカスタマイズしていますが、ユーザーが12時間モード(AM / PM列を表示)を使用しているか、24時間モードを使用しているかに応じて、2つの異なる画像が必要です。12/24時間制のユーザー設定を検出するにはどうすればよいですか?

ありがとう

4

3 に答える 3

39

他のものよりもさらに短い:

NSString *format = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
BOOL is24Hour = ([format rangeOfString:@"a"].location == NSNotFound);

説明

Unicode Locale Markup Language – Part 4:Datesに記載されているように、am/pm記号を表す文字列フォーマット文字は「a」です。

同じドキュメントで、特別なテンプレート記号「j」についても説明されています。

これは専用のシンボルです。パターンまたはスケルトンデータで発生してはなりません。代わりに、柔軟な日付パターン生成を行うAPIに渡されるスケルトンで使用するために予約されています。このようなコンテキストでは、h、H、K、またはkがロケールの標準の短時間形式で使用されているかどうかによって決定される、ロケールの優先時間形式(h、H、K、またはk)を要求します。このようなAPIの実装では、availableFormatsデータとの照合を開始する前に、「j」をh、H、K、またはkに置き換える必要があります。APIに渡されるスケルトンで「j」を使用することが、スケルトンにロケールの優先タイムサイクルタイプ(12時間または24時間)を要求させる唯一の方法であることに注意してください。

このNSString方法dateFormatFromTemplate:options:locale:は、AppleのNSDateFormatterドキュメントで説明されています。

指定されたロケールに適切に配置された、指定された日付形式コンポーネントを表すローカライズされた日付形式文字列を返します。

したがって、そのメソッドが行うことは@"j"、テンプレートとして渡したを、に適したフォーマット文字列に変換することですNSDateFormatter。この文字列の@"a"どこかにam/pm記号が含まれている場合は、ロケール(およびOSによって問い合わせられている他のユーザー設定)がam/pmを表示することを望んでいることがわかります。

于 2012-09-02T14:23:17.307 に答える
7

日付拡張の形式で最も人気のある2つのソリューションのSwift(3.x)バージョン:

extension Date {

    static var is24HoursFormat_1 : Bool  {
        let dateString = Date.localFormatter.string(from: Date())

        if dateString.contains(Date.localFormatter.amSymbol) || dateString.contains(Date.localFormatter.pmSymbol) {
            return false
        }

        return true
    }

    static var is24HoursFormat_2 : Bool {
        let format = DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.autoupdatingCurrent)
        return !format!.contains("a")
    }

    private static let localFormatter : DateFormatter = {
        let formatter = DateFormatter()

        formatter.locale    = Locale.autoupdatingCurrent
        formatter.timeStyle = .short
        formatter.dateStyle = .none

        return formatter
    }()
}

使用法 :

Date.is24HoursFormat_1
Date.is24HoursFormat_2

NSDate拡張機能の形式で最も人気のある2つのソリューションのSwift(2.0)バージョン:

extension NSDate {

    class var is24HoursFormat_1 : Bool  {
        let dateString = NSDate.localFormatter.stringFromDate(NSDate())

        if dateString.containsString(NSDate.localFormatter.AMSymbol) || dateString.containsString(NSDate.localFormatter.PMSymbol) {
            return false
        }

        return true
    }

    class var is24HoursFormat_2 : Bool {
        let format = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: NSLocale.autoupdatingCurrentLocale())
        return !format!.containsString("a")
    }

    private static let localFormatter : NSDateFormatter = {
        let formatter = NSDateFormatter()

        formatter.locale    = NSLocale.autoupdatingCurrentLocale()
        formatter.timeStyle = .ShortStyle
        formatter.dateStyle = .NoStyle

        return formatter
    }()
}

AppleはNSDateFormatter(Date Formatters)について次のように言っていることに注意してください:

日付フォーマッタの作成は安価な操作ではありません。フォーマッタを頻繁に使用する可能性がある場合は、通常、複数のインスタンスを作成して破棄するよりも、単一のインスタンスをキャッシュする方が効率的です。1つのアプローチは、静的変数を使用することです。

それが静的レットの理由です

次に、NSLocale.autoupdatingCurrentLocale()(is24HoursFormat_1の場合)を使用する必要があります。そうすれば、常に実際の現在の状態を取得できます。

于 2015-11-01T22:45:47.890 に答える
3

そしておそらくもっとたくさんあります...

于 2012-08-31T11:32:31.830 に答える