2015-01-27 15 views
5

Chciałbym sprawdzić, czy użytkownik wybrał 12-godzinny lub 24-godzinny zegar jako ich preferencje w OS X i iOS. Więc chciałbym, aby wykryć, czy użytkownik wykonał następujące czynności:NSDateFormatter wykrywa 24-godzinny zegar w OS X i iOS

  • Na Mac, Preferencje systemu jest w Data & razem należy wybrać 24-godzinny
  • na iPhone, preferencja jest w Ustawienia, Ogólne, data & czas, czas 24-godzinny

obecnie mam następujący kod, ale zawsze zwraca czas jako reprezentowany przez zegar 12-godzinny, nawet jeśli preferencji system ustanowiony przez użytkownika jest za 24-godzinny zegar.

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

chciałbym znaleźć rozwiązanie napisane w Objective-C i Swift zarówno dla Mac i iPhone, które mogą wykryć, czy urządzenie wyświetla zegar 24-godzinny lub 12-godzinny.

+0

Zobacz [this] (http://stackoverflow.com/questions/6613110/what-is-the-best-way-to-deal-z-nadatnymformatowaniem-zapisaniem-określonym). Jest to rozwiązanie przeciwne do twojego problemu, ale daje ci pewne podstawy. (Chociaż nie wiem od razu, jak można w sposób pewny przetestować ustawienie 12/24 pomimo wszystkich możliwych ustawień lokalnych itp.) –

+0

@HotLicks Edytowałem moje pytanie. Kod działa, ale błąd dotyczy sposobu posługiwania się ustawieniami na komputerze Mac i tego, jak korzystam z symulatora iPhone'a na iOS. – wigging

+0

Kiedy patrzyłem na problem, nie mogłem wymyślić sposobu na sprowokowanie go na symulatorze iPhone'a - musieliśmy przetestować prawdziwe telefony na żywo. (Nie martwił się o OSx.) –

Odpowiedz

15

Funkcja szablonu daty ma fajną sztuczkę. Istnieje specyfikator szablonu j, który zmieni się w format godzinny, w zależności od tego, czy region używa formatu 12- czy 24-godzinnego. To zmieni się w coś takiego jak h a na 12 godzin (w tym przypadku en_US) lub HH dla formatu 24-godzinnego (en_GB).

Wtedy po prostu trzeba sprawdzić, czy format daty zawiera 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") 
} 

Należy to wziąć pod uwagę formatu nadpisuje również.

Jest to podobne do czeku, ale nie należy próbować sprawdzać pod kątem AM lub PM. Są to angielskie wersje, jest ich o wiele więcej. Na przykład w Niemczech, jeśli wymusisz 12-godzinny format iOS używa nachm. i vorm.. Prawidłowym sposobem jest sprawdzenie formatu dla a.

+0

Zgadzam się, to wydaje się być znacznie lepszym podejściem. Ostatnia rzecz - Czy istnieje sposób na przetestowanie tego w symulatorze iPhone'a?Wygląda na to, że musisz uruchomić kod na rzeczywistym urządzeniu, ale wygodnie byłoby móc zmienić ustawienia regionalne na 24-godzinny zegar w symulatorze. – wigging

+0

O ile mi wiadomo, iOS Simulator nie obsługuje tych niestandardowych formatów. –

1

Format daty używany na pasku menu w systemie Mac OS X znajduje się w pliku ~/Library/Preferences/com.apple.menuextra.clock.plist. W moim systemie (pl locale) wygląda to na czas nie 24 godzinnym:

<?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> 

i tak przez czas 24-godzinny:

<?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> 

Można pobrać ciąg formatu przy użyciu defaults read com.apple.menuextra.clock DateFormat od z linii poleceń lub NSUserDefaults z Obj-C lub Swift. Następnie możesz sprawdzić, czy ciąg formatu zawiera a. Jeśli tak, zegar nie jest ustawiony na 24-godzinny czas.