2013-04-12 11 views
6

Nella mia app ho un'opzione per sospendere l'esecuzione per un certo periodo di tempo. Voglio mostrare il momento in cui l'esecuzione riprenderà, compresi i secondi, e voglio che la stringa temporale sia formattata secondo le impostazioni sustem. Questo è il codice mi si avvicinò con:SimpleDateFormat.getTimeInstance ignora il formato 24 ore

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

Ciò produce una stringa formattata con i secondi, ma restituisce ora AM/PM-formattato, anche se ho impostare il formato a 24 ore nelle impostazioni. È ancora più divertente dal momento che il tempo nella barra delle applicazioni è formattato correttamente utilizzando il formato 24 ore.

Ho provato ad utilizzare DateFormat.getTimeFormat come questo:

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

Ma la stringa risultante non contiene secondi, e non vedo un modo per includerli.

Sto eseguendo questo codice sull'emulatore Android 4.2. Mi sto perdendo qualcosa qui? SimpleDateFormat non è a conoscenza dell'impostazione 12/24 ore? In caso contrario, come si ottiene una rappresentazione in formato stringa del tempo (comprese ore, minuti e secondi) nel formato di sistema?

+0

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

+0

No. Discutono il formato della data. Sono interessato al formato dell'ora. Sfortunatamente non funzionano sempre allo stesso modo. –

+0

Se si sostituisce getTimeFormat per getDateFormat 'android.text.format.DateFormat.getTimeFormat (getApplicationContext()))'? –

risposta

2

Può dipendere molto dal tipo di sistema in cui si trova il sistema. Se il sistema è in USA, verrà impostato su 12 ore anziché 24 ore. vale a dire

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); 

vi darà

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

Così, forse si può afferrare la lingua del sistema e specificare nel vostro formattatore.

Tuttavia, se lo si desidera sempre nel formato 24 ore, quindi suggerisco di specificarlo esplicitamente nel programma di formattazione.

UPDATE: Dal momento che si voleva afferrare il formato dell'ora in base alla specificazione del dispositivo, è possibile utilizzare il valore del sistema Time_12_24 e determinare il formato dal valore risultante.

+1

"Ti suggerisco di specificarlo esplicitamente nel tuo formattatore" - Questa è sicuramente un'opzione, ma speravo che esistesse un metodo già disponibile che potesse farlo automaticamente :) –

+0

Questo suggerimento era solo se si desidera -always- visualizzare il Formato 24 ore. Ovviamente, è sempre possibile utilizzare le impostazioni internazionali predefinite della JVM e farlo determinare "automaticamente" il formato di visualizzazione. – dispake

+1

Non voglio -always- visualizza il formato 24 ore, ma voglio visualizzare il formato 24 ore se l'utente ha selezionato la casella di controllo appropriata nelle impostazioni del suo dispositivo. Che include i casi se l'utente ha Locale.US. Quindi diciamo che ho due casi: (1) Locale.US e casella di controllo 24 ore UNCHECKED, (2) Locale.US e casella di controllo 24 ore CONTROLLATA. In entrambi i casi, SimpleDateFormat.getTimeInstance restituisce le ore nel formato AM/PM, ignorando le impostazioni del sistema a 24 ore. –

0

Probabilmente si dovrebbe creare il proprio modello di formato. Se ricordo male, il pattern che useresti è "HH: mm: ss.SSS" per darti ore, minuti, secondi e tre cifre di precisione di secondi frazionari.

Vedere i documenti di riferimento API per SimpleDateFormat.

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

Invece di hh, utilizzare kk.

5

facile soluzione è:

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

Questa gestisce correttamente impostazione dell'utente ore 12/24.

2

Sembra che ci sia un bug in Android da 5 a 6.0.1 in cui DateFormat#getTimeInstance(int) restituisce un DateFormat che ignora la Usa formato impostazione 24 ore. Le altre risposte menzionano una serie di soluzioni alternative per questo bug. È possibile seguire il problema su https://code.google.com/p/android/issues/detail?id=181201.