2013-04-12 14 views
6

W mojej aplikacji mam opcję wstrzymania wykonywania na określony czas. Chcę pokazać czas, kiedy wykonanie zostanie wznowione, w tym sekundy, i chcę, aby łańcuch czasu został sformatowany zgodnie z ustawieniami sustem. Jest to kod wymyśliłem:SimpleDateFormat.getTimeInstance ignoruje format 24-godzinny

long millis = getResumeTime(); 
String timeString; 
timeString = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM).format(millis); 

ten przynosi sformatowany ciąg z sekund, ale zwraca AM/PM-sformatowany czas, choć mam ustawić 24-godzinny format czasu w ustawieniach. Jest jeszcze zabawniej, ponieważ czas w zasobniku systemowym jest poprawnie sformatowany przy użyciu formatu 24-godzinnego.

Próbowałem za pomocą DateFormat.getTimeFormat tak:

long millis = getResumeTime(); 
String timeString; 
java.text.DateFormat df = android.text.format.DateFormat.getTimeFormat(this); 
timeString = df.format(millis); 

Ale wynikowy ciąg nie zawiera sekund i nie widzę sposobu, aby je dołączyć.

Używam tego kodu na emulatorze Androida 4.2. Czy coś mi umyka? Czy SimpleDateFormat nie zna ustawienia 12/24 godzin? Jeśli nie, w jaki sposób uzyskać łańcuchową reprezentację czasu (w tym godzin, minut i sekund) w formacie systemowym?

+0

Duplikat? http://stackoverflow.com/questions/9235934/get-preferred-date-format-string-of-android-system –

+0

Nie. Dyskutują o formacie daty. Interesuje mnie format czasu. Niestety nie zawsze działają w ten sam sposób. –

+0

Jeśli podstawisz getTimeFormat dla getDateFormat 'android.text.format.DateFormat.getTimeFormat (getApplicationContext()))'? –

Odpowiedz

2

Może bardzo dobrze zależeć od ustawień regionalnych. Jeśli system jest w USA, domyślnie będzie to 12 godzin zamiast 24h. tj

long millis = new Date().getTime(); 
String uk = SimpleDateFormat 
       .getTimeInstance(SimpleDateFormat.MEDIUM, Locale.UK) 
       .format(millis); 
String us = SimpleDateFormat 
       .getTimeInstance(SimpleDateFormat.MEDIUM, Locale.US) 
       .format(millis); 
System.out.println("UK: " + uk); 
System.out.println("US: " + us); 

daje

UK: 16:19:49 
US: 4:19:49 PM 

Więc chyba można pobrać regionalnych systemu i podać go w formater.

Jeśli jednak chcesz go zawsze w formacie 24h, proponuję jednoznacznie określić go w swoim formatyzatorze.

UPDATE: Ponieważ chciał chwycić format czasu w oparciu o specyfikację urządzenia, można użyć systemu Time_12_24 wartość i określić format z otrzymanej wartości.

+1

"Sugeruję, abyś wyraźnie określił to w swoim formatatorze" - To jest z pewnością opcja, ale miałem nadzieję, że była już dostępna metoda, która mogłaby zrobić to automatycznie :) –

+0

Ta sugestia była tylko wtedy, gdy chcesz -always- wyświetlać Format 24H. Oczywiście zawsze można użyć domyślnego ustawienia narodowego maszyny JVM i automatycznie "określić" format wyświetlania. – dispake

+1

Nie chcę - zawsze wyświetlać formatu 24-godzinnego, ale chcę wyświetlić format 24-godzinny, jeśli użytkownik zaznaczył odpowiednie pole wyboru w ustawieniach swojego urządzenia. Co obejmuje przypadki, jeśli użytkownik ma Locale.US. Załóżmy więc, że mam dwie sprawy: (1) pole wyboru Locale.US i 24-godzinne pole wyboru UNCHECKED, (2) pole wyboru Locale.US i 24-godzinne CHECKED. W obu przypadkach SimpleDateFormat.getTimeInstance zwraca godziny w formacie AM/PM, ignorując ustawienia systemu 24-godzinnego. –

0

Powinieneś prawdopodobnie utworzyć własny wzór formatu. Jeśli dobrze pamiętam, użyty wzorzec to "HH: mm: ss.SSS", co daje dokładność godzin, minut, sekund i trzech cyfr ułamkowych sekund.

Zobacz dokumentacja interfejsu API dla SimpleDateFormat.

1
String timestamp = (DateFormat.format("yyyy.MM.dd kk:mm:ss", new Date())).toString(); 

Zamiast hh, użyj kk.

5

prostsze rozwiązanie:

String timeString = DateUtils.formatDateTime(getContext(), timeInMillis, 
      DateUtils.FORMAT_SHOW_TIME); 

to poprawnie obsługuje 12/24 ustawienie godziny użytkownika.

2

Wydaje się, że to błąd w Androidzie 6.0.1 do 5, gdzie DateFormat#getTimeInstance(int) zwraca DateFormat że ignoruje Użyj 24-godzinny format ustawienia. Pozostałe odpowiedzi wspominają różne obejścia tego błędu. Możesz śledzić ten problem na https://code.google.com/p/android/issues/detail?id=181201.