UIDatePickerを使用して時間を選択しています。ピッカーの背景もカスタマイズしていますが、ユーザーが12時間モード(AM / PM列を表示)を使用しているか、24時間モードを使用しているかに応じて、2つの異なる画像が必要です。12/24時間制のユーザー設定を検出するにはどうすればよいですか?
ありがとう
UIDatePickerを使用して時間を選択しています。ピッカーの背景もカスタマイズしていますが、ユーザーが12時間モード(AM / PM列を表示)を使用しているか、24時間モードを使用しているかに応じて、2つの異なる画像が必要です。12/24時間制のユーザー設定を検出するにはどうすればよいですか?
ありがとう
他のものよりもさらに短い:
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を表示することを望んでいることがわかります。
日付拡張の形式で最も人気のある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の場合)を使用する必要があります。そうすれば、常に実際の現在の状態を取得できます。