2012-08-31 174 views
5

我正在使用UIDatePicker來選擇時間。我也在自定義選取器的背景,但是根據用戶是否使用12小時模式(顯示AM/PM列)或24小時模式,我需要2個不同的圖像。 如何檢測12/24小時的用戶設置?檢測iPhone 24小時時間設置

感謝

回答

3

,有可能是很多很多......

+0

哇,謝謝。我做了一個谷歌搜索,通常顯示堆棧溢出結果,但我完全空白了! – Darren

31

甚至比別人更短:

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

說明

字符串格式化字符來表示的AM/PM符號是 「一」,如在Unicode Locale Markup Language – Part 4: Dates記錄。

同樣的文件也解釋了特殊的模板符號「J」:

這是一種特殊用途的符號。它不能出現在模式或骨架數據中。相反,它被保留用於傳遞給API的骨架中,以便生成靈活的日期模式。在這種情況下,它根據語言環境的標準短時間格式是否使用h,H,K或k來確定語言環境(h,H,K或k)的首選小時格式。在實現這樣的API時,在開始與availableFormats數據匹配之前,必須用h,H,K或k替換'j'。請注意,在傳遞給API的骨架中使用'j'是使骨架請求成爲語言環境首選時間循環類型(12小時或24小時)的唯一方法。

NSString方法dateFormatFromTemplate:options:locale:在蘋果的NSDateFormatter documentation描述:

返回表示適當地配置爲指定的區域設置給定日期格式部件本地化日期格式字符串。

那麼,什麼方法做的就是打開你@"j"傳遞作爲模板,以適合NSDateFormatter格式字符串。如果這個字符串在任何地方都包含am/pm符號@"a",那麼您知道要顯示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 
    }() 
} 

請注意,蘋果稱在NSDateFormatter(Date Formatters)以下:

創建的日期格式是不是一個便宜的操作。如果您很可能經常使用格式化程序 ,那麼緩存 單個實例比創建和處理多個實例通常更高效。 一種方法是使用靜態變量。

這就是靜態的原因讓

其次,你應該使用NSLocale.autoupdatingCurrentLocale()(用於is24HoursFormat_1),這樣,你總是會得到實際的當前狀態。