2012-08-31 13 views
5

Utilizzo un UIDatePicker per selezionare un'ora. Sto anche personalizzando lo sfondo del selettore, tuttavia ho bisogno di 2 immagini diverse a seconda che l'utente stia utilizzando la modalità 12 ore (che visualizza la colonna AM/PM) o la modalità 24 ore. Come posso rilevare le impostazioni degli utenti per l'ora delle ore 12/24?Rileva impostazione ora 24 ore su iPhone

Grazie

risposta

3

e c'è probabilmente molti, molti di più ...

+0

Wow, grazie. Ho fatto una ricerca su Google che normalmente mostra i risultati di Stack Overflow ma sono venuto completamente vuoto! – Darren

31

Anche più corta delle altre:

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

Spiegazione

Il carattere di formattazione della stringa per rappresentare il simbolo am/pm è "A", come documentato in Unicode Locale Markup Language – Part 4: Dates.

Lo stesso documento spiega anche il modello simbolo speciale "j":

Questo è un simbolo per un fine particolare. Non deve verificarsi nei dati di pattern o skeleton. Invece, è riservato per l'uso negli scheletri passati alle API che eseguono la generazione flessibile del modello di data. In tale contesto, richiede il formato di ora preferito per le impostazioni internazionali (h, H, K o k), come determinato dall'utilizzo di h, H, K o k nel formato di breve durata standard per le impostazioni internazionali. Nell'implementazione di tale API, 'j' deve essere sostituito da h, H, K ok prima di iniziare una corrispondenza con i dati di AvailableFormats. Si noti che l'uso di 'j' in uno scheletro passato a un'API è l'unico modo per richiedere a uno scheletro il tipo di ciclo temporale preferito di una locale (12 ore o 24 ore).

Il metodo NSStringdateFormatFromTemplate:options:locale: è descritto in NSDateFormatter documentation di Apple:

restituisce una stringa di formato data localizzata rappresenta i componenti formato data determinata disposti opportunamente del locale specificato.

Allora, che cosa questo metodo farà è girare la @"j" si passa come modello per una stringa di formato adatto per NSDateFormatter. Se questa stringa contiene il simbolo am/pm ovunque, allora sapete che la locale (e le altre impostazioni utente che vengono interrogate dal sistema operativo per voi) vuole che venga visualizzata l'am/pm.

+0

Ero totalmente sul punto di votare la tua risposta come non funzionante, finché non l'ho letto molto più vicino. È intelligente Ben fatto! – Benjohn

+0

Solo per aggiungere che questo non funzionerà sul simulatore. – GuybrushThreepwood

4

Swift versione (3.x) di due soluzioni più popolari in forma di estensione Data:

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 
    }() 
} 

Usage:

Date.is24HoursFormat_1 
Date.is24HoursFormat_2 

Swift (2.0) versione di due soluzioni più popolari sotto forma di estensione 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 
    }() 
} 

Si prega di notare che Apple dice il seguente su NSDateFormatter (Date Formatters):

Creazione di una data di formattazione non è un'operazione a basso costo. Se è probabile che utilizzi frequentemente un formattatore, è in genere più efficiente memorizzare nella cache una singola istanza piuttosto che creare e disporre di più istanze. Un approccio consiste nell'utilizzare una variabile statica.

Questo è il motivo per statica diamo

In secondo luogo si dovrebbe usare NSLocale.autoupdatingCurrentLocale() (per is24HoursFormat_1), in questo modo otterrete sempre lo stato attuale vero e proprio.

Problemi correlati