2012-08-31 10 views
5

私はUIDatePickerを使って時間を選択しています。また、ピッカーの背景もカスタマイズしていますが、12時間モード(AM/PM列を表示)と24時間モードのどちらを使用しているかによって、2つの異なるイメージが必要です。 12/24時間のユーザー設定をどのように検出できますか?iPhone 24時間設定を検出する

おかげ

答えて

3

と他のものよりも...

+0

うわー、ありがとう。私は通常スタックオーバーフローの結果を表示するGoogleの検索を行ったが、私は完全に空白になった! – Darren

31

でも短い多く、多くはおそらくあります。

に記載されているように210
NSString *format = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]]; 
BOOL is24Hour = ([format rangeOfString:@"a"].location == NSNotFound); 

説明

午前/午後記号を表す文字列フォーマット文字は、「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 documentationに記載されている:

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

だから、何という方法がどうなることは、あなたがNSDateFormatterに適したフォーマット文字列にして、テンプレートとして渡す@"j"を回しています。この文字列にAM/PM記号@"a"が含まれている場合は、ロケール(およびOSによって質問される他のユーザー設定)がam/pmを表示することがわかります。日付延長の形で二つの最も人気のあるソリューションの

+0

私はそれをもっと近く読むまで、私はあなたの答えを完全に投票していませんでした。それは賢いです。良いですね! – Benjohn

+0

これを追加すると、シミュレータでは機能しません。 – GuybrushThreepwood

4

スウィフト(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 

スウィフト(2。0)NSDate延長の形で二つの最も人気のあるソリューションのバージョン:日付フォーマッタを作成

が安く操作ではありません。

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つの方法は、静的変数を使用することです。静的理由厥

は、第二に、あなたが(is24HoursFormat_1用)NSLocale.autoupdatingCurrentLocale()、あなたは常に実際の現在の状態を取得しますその方法を使用する必要があります

をしましょう。