2015-01-27 9 views
5

Vorrei verificare se l'utente ha selezionato il formato 12 ore o 24 ore come preferenziale in OS X e iOS. Quindi vorrei rilevare se l'utente ha effettuato le seguenti operazioni:NSDateFormatter rileva il clock di 24 ore in OS X e iOS

  • Sul Mac, la preferenza del sistema è in Data & tempo, utilizzare 24 ore Orologio
  • Su iPhone, la preferenza è in impostazioni, generali, Data & ora, 24 ore tempo

al momento ho il seguente codice ma restituisce sempre il tempo come rappresentato dal formato a 12 ore, anche se la preferenza di sistema impostata dall'utente è per l'orologio delle 24 ore.

let timeFormatter = NSDateFormatter() 
timeFormatter.locale = NSLocale.currentLocale() 
timeFormatter.dateStyle = NSDateFormatterStyle.NoStyle 
timeFormatter.timeStyle = NSDateFormatterStyle.ShortStyle 

let ampmtext = timeFormatter.stringFromDate(NSDate()) 
println(ampmtext) 

if ampmtext.rangeOfString("M") != nil { 
    println("12-hour clock") 
} else { 
    println("24-hour clock") 
} 

mi piacerebbe trovare una soluzione scritta in Objective-C e Swift sia per Mac e iPhone in grado di rilevare se l'orologio dispositivo visualizza 24 ore o 12 ore di tempo.

+0

Vedere [this] (http://stackoverflow.com/questions/6613110/what-is-the-best-way-to-deal-with-the-nsdateformatter-locale-feature). Sta affrontando una sorta di opposto del tuo problema, ma ti dà un po 'di background. (Anche se non so per caso, so di un modo sicuro per testare esplicitamente l'impostazione 12/24 nonostante tutte le possibili impostazioni locali, ecc.) –

+0

@HotLicks Ho modificato la mia domanda. Il codice funziona ma l'errore è nel modo in cui gestisco le impostazioni sul Mac e su come sto usando il simulatore iPhone per iOS. – wigging

+0

Quando guardavo il problema non riuscivo a trovare un modo per provocarlo sul simulatore dell'iPhone: dovevamo testare con veri telefoni live. (Non ero preoccupato per OSx.) –

risposta

15

La funzione di modello di data ha un trucco accurato. C'è uno specificatore di modello j che diventerà un formato ora a seconda che le impostazioni internazionali utilizzino il formato 12 o 24 ore. Si trasformerà in qualcosa come h a per 12 ore (en_US in questo caso) o HH per il formato 24 ore (en_GB).

Poi basta controllare se il formato della data contiene a

//let locale = NSLocale(localeIdentifier: "de_DE") 
//let locale = NSLocale(localeIdentifier: "en_US") 
//let locale = NSLocale(localeIdentifier: "en_GB") 
let locale = NSLocale.currentLocale() 

let dateFormat = NSDateFormatter.dateFormatFromTemplate("j", options: 0, locale: locale)! 

if dateFormat.rangeOfString("a") != nil { 
    println("12 hour") 
} 
else { 
    println("24 hour") 
} 

Questo dovrebbe prendere formattazione sovrascrive in considerazione pure.

Questo è simile al controllo, ma non si dovrebbe cercare di verificare per AM o PM. Queste sono le versioni in inglese, ce ne sono molte altre. Ad esempio, in Germania, se imposti un formato di 12 ore, iOS utilizza nachm. e vorm.. Il modo corretto è verificare il formato per a.

+0

Sono d'accordo, questo sembra essere un approccio molto migliore. Un'ultima cosa: c'è un modo per testarlo nel simulatore dell'iPhone?Sembra che tu debba eseguire il codice sul dispositivo reale, ma sarebbe comodo poter cambiare le impostazioni internazionali in un orologio a 24 ore nel simulatore. – wigging

+0

Per quanto ne so, iOS Simulator non supporta questi formati personalizzati. –

1

Il formato della data utilizzato nella barra dei menu su Mac OS X è contenuto nel file ~/Library/Preferences/com.apple.menuextra.clock.plist. Sul mio sistema (locale en_US) sembra che questo per tempo di non-24 ore:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>DateFormat</key> 
    <string>EEE h:mm a</string> 
    <key>FlashDateSeparators</key> 
    <false/> 
    <key>IsAnalog</key> 
    <false/> 
</dict> 
</plist> 

e così per 24 ore di tempo:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>DateFormat</key> 
    <string>EEE H:mm</string> 
    <key>FlashDateSeparators</key> 
    <false/> 
    <key>IsAnalog</key> 
    <false/> 
</dict> 
</plist> 

È possibile recuperare la stringa di formato utilizzando defaults read com.apple.menuextra.clock DateFormat da la riga di comando o NSUserDefaults da Obj-C o Swift. È quindi possibile verificare se la stringa di formato contiene a. Se lo fa, l'orologio non è impostato su 24 ore.

Problemi correlati