2012-08-31 12 views
5

Ich verwende einen UIDatePicker, um eine Zeit auszuwählen. Ich passe auch den Hintergrund des Pickers an, aber ich brauche 2 verschiedene Bilder, je nachdem, ob der Benutzer den 12-Stunden-Modus (der AM/PM-Spalte anzeigt) oder den 24-Stunden-Modus verwendet. Wie kann ich die Benutzereinstellungen für die 12/24 Stunden Zeit erkennen?iPhone-24-Stunden-Zeiteinstellung erkennen

Dank

Antwort

3

und es gibt wahrscheinlich viele, viele mehr ...

+0

Wow, danke. Ich habe eine Google-Suche durchgeführt, die normalerweise Stack Overflow-Ergebnisse anzeigt, aber ich bin völlig leer ausgegangen! – Darren

31

Noch kürzer als die anderen:

Erklärung

Das String Formatierungszeichen des am/pm Symbol darzustellen, ist "a", wie in Unicode Locale Markup Language – Part 4: Dates dokumentiert.

Das gleiche Dokument erklärt auch die besondere Vorlage Symbol "j":

Dies ist ein Spezial-Symbol. Es darf nicht in Muster- oder Skelettdaten vorkommen. Stattdessen ist es für die Verwendung in Skeletten reserviert, die an APIs übergeben werden, die eine flexible Datumsmustergenerierung durchführen. In einem solchen Kontext fordert es das bevorzugte Stundenformat für das Gebietsschema (h, H, K oder k) an, das dadurch bestimmt wird, ob h, H, K oder k im Standard-Kurzzeitformat für das Gebietsschema verwendet wird. Bei der Implementierung einer solchen API muss "j" durch h, H, K oder k ersetzt werden, bevor eine Übereinstimmung mit den verfügbarenFormatsdaten begonnen wird. Beachten Sie, dass die Verwendung von "j" in einem an eine API übergebenen Skeleton die einzige Möglichkeit ist, einen Skeleton zu veranlassen, den bevorzugten Zeitzyklus eines Gebietsgebiets anzugeben (12-Stunden oder 24-Stunden).

Die NSString Methode dateFormatFromTemplate:options:locale: wird in Apple NSDateFormatter documentation beschrieben:

Gibt eine lokalisierte Datumsformat Zeichenfolge die angegebenen Datumsformat Komponenten in geeigneter Weise für die angegebene locale angeordnet darstellt.

Also, was diese Methode tut, ist drehen Sie das @"j" Sie passieren in als Vorlage in ein Format-String für NSDateFormatter. Wenn diese Zeichenfolge irgendwo das Symbol @"a" am/pm enthält, dann wissen Sie, dass das Gebietsschema (und andere Benutzereinstellungen, die vom Betriebssystem für Sie abgefragt werden) am/pm angezeigt werden soll.

+0

Ich war total dabei, deine Antwort als nicht funktionierend zu bewerten, bis ich es viel näher gelesen habe. Das ist schlau. Schön! – Benjohn

+0

Nur hinzufügen, dass dies auf dem Simulator nicht funktioniert. – GuybrushThreepwood

4

Swift (3.x) Version von beiden beliebtestenen Lösungen in Form von Datum Erweiterung:

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

Verbrauch:

Date.is24HoursFormat_1 
Date.is24HoursFormat_2 

Swift (2.0) Version von beiden beliebtestenen Lösungen in Form von NSDate Erweiterung:

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

Bitte beachten Sie, dass Apple sagt folgende auf NSDateFormatter (Date Formatters):

ein Datum Formatierer zu erstellen ist kein billiger Betrieb. Wenn Sie wahrscheinlich häufig einen Formatierer verwenden, ist es normalerweise effizienter, eine einzelne Instanz im Cache zwischenzuspeichern, als mehrere Instanzen zu erstellen und zu verwerfen. Ein Ansatz besteht darin, eine statische Variable zu verwenden.

Das ist der Grund für die statische lassen

Zweitens sollten Sie NSLocale.autoupdatingCurrentLocale() verwenden (für is24HoursFormat_1), auf diese Weise werden Sie immer den aktuellen aktuellen Zustand erhalten.