2012-08-31 7 views
5

Używam UIDatePicker do wybrania czasu. Dostosowuję również tło selektora, jednak potrzebuję dwóch różnych obrazów w zależności od tego, czy użytkownik korzysta z trybu 12-godzinnego (wyświetlającego kolumnę AM/PM), czy też w trybie 24-godzinnym. Jak wykryć ustawienia użytkowników na godzinę 12/24 godzin?Wykryj ustawienia czasu 24-godzinnego dla iPhone'a

Dzięki

Odpowiedz

3

i tam pewnie wiele, wiele więcej ...

+0

Wow, dzięki. Zrobiłem wyszukiwarkę Google, która zwykle pokazuje wyniki przepełnienia stosu, ale pojawił się zupełnie pusty! – Darren

31

nawet krótszy niż inni:

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

Wyjaśnienie

Charakter formatowanie ciąg do reprezentowania symbol AM/PM jest "a", co zostało udokumentowane w Unicode Locale Markup Language – Part 4: Dates.

Ten sam dokument opisuje również specjalny szablon symbolu "J":

Jest to symbol specjalnego przeznaczenia. Nie może występować w danych wzorca lub szkieletu. Zamiast tego jest on zarezerwowany do użytku w szkieletach przekazywanych do API, które generują elastyczny wzór daty. W takim kontekście żąda formatu preferowanej godziny dla ustawień narodowych (h, H, K lub k), określanych przez to, czy h, H, K, lub k jest używane w standardowym krótkim formacie czasowym dla ustawień narodowych. Podczas implementacji takiego API, "j" musi zostać zastąpione przez h, H, K lub k przed rozpoczęciem dopasowania do danych availableFormats. Zauważ, że użycie 'j' w szkielecie przekazywanym do API jest jedynym sposobem na uzyskanie szkieletu żądania preferowanego rodzaju czasu lokalnego (12-godzinnego lub 24-godzinnego).

NSString metoda dateFormatFromTemplate:options:locale: opisano w Apple NSDateFormatter documentation:

Zwraca zlokalizowaną format daty łańcuch znaków reprezentujący elementy formatu podanej daty ułożone odpowiednio do określonej lokalizacji.

Więc, co to jest metoda zrobi włączyć @"j" przechodzą w jako szablon do łańcucha formacie odpowiednim dla NSDateFormatter. Jeśli ten ciąg zawiera w dowolnym miejscu symbol am/pm @"a", to wiesz, że ustawienia narodowe (i inne ustawienia użytkownika, które są przesłuchiwane przez system operacyjny), mają wyświetlać am/pm.

+0

Nie miałem zamiaru głosować na twoją odpowiedź jako nie działa, dopóki nie przeczytam jej o wiele bliżej. To sprytnie. Niezłe! – Benjohn

+0

Wystarczy dodać, że to nie zadziała na symulatorze. – GuybrushThreepwood

4

Swift (3.x) wersja z dwóch najbardziej popularnych rozwiązań w postaci Data rozszerzenia:

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

Zastosowanie:

Date.is24HoursFormat_1 
Date.is24HoursFormat_2 

Swift (2.0) Wersja z dwóch najbardziej popularnych rozwiązań w postaci przedłużenia 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 
    }() 
} 

Należy pamiętać, że Apple mówi po dniu NSDateFormatter (Date Formatters):

Tworzenie datę formatowania nie jest tania eksploatacja. Jeśli prawdopodobnie używasz często formatera, zwykle wydajniej jest buforować pojedynczą instancję niż tworzyć i usuwać wiele instancji. Jednym ze sposobów jest użycie zmiennej statycznej.

Ów powód dla statycznych niech

drugie należy użyć NSLocale.autoupdatingCurrentLocale() (dla is24HoursFormat_1), w ten sposób zawsze będziesz uzyskać rzeczywisty stan obecny.