2013-04-12 16 views
6

In meiner App habe ich eine Option, die Ausführung für eine bestimmte Zeit zu unterbrechen. Ich möchte die Uhrzeit anzeigen, zu der die Ausführung fortgesetzt wird, einschließlich der Sekunden, und ich möchte, dass die Zeitzeichenfolge entsprechend den Einstellungen für die Uhrzeit formatiert wird. Dies ist der Code, den ich kam mit:SimpleDateFormat.getTimeInstance ignoriert 24-Stunden-Format

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

Diese eine formatierte Zeichenfolge mit Sekunden nicht produzieren, aber es gibt AM/PM-Format Zeit, obwohl ich 24-Stunden-Format in den Einstellungen festgelegt habe. Es ist noch lustiger, da die Zeit in der Taskleiste korrekt im 24-Stunden-Format formatiert ist.

Ich versuchte DateFormat.getTimeFormat wie folgt aus:

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

Aber die resultierende Zeichenfolge Sekunden nicht enthält, und ich sehe keinen Weg, sie zu schließen.

Ich führe diesen Code auf Android 4.2 Emulator. Fehle ich hier etwas? Ist SimpleDateFormat die 12/24-Stundeneinstellung nicht bekannt? Wenn nicht, wie bekomme ich eine String-Darstellung der Zeit (einschließlich Stunden, Minuten und Sekunden) im Systemformat?

+0

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

+0

Nein. Sie diskutieren Datumsformat. Ich bin interessiert am Zeitformat. Leider funktionieren sie nicht immer gleich. –

+0

Wenn Sie getTimeFormat ersetzen für getDateFormat 'android.text.format.DateFormat.getTimeFormat (getApplicationContext()))'? –

Antwort

2

Es kann sehr gut davon abhängen, in welchem ​​Gebietsschema sich Ihr System befindet. Wenn sich Ihr System in den USA befindet, wird es standardmäßig auf 12h anstelle von 24h eingestellt. das heißt

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

werden Sie

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

So geben, vielleicht können Sie das Gebietsschema des Systems greifen und es in Ihrem Formatierungsprogramm angeben.

Wenn Sie jedoch immer im 24-Stunden-Format möchten, dann empfehle ich, dass Sie es explizit in Ihrem Formatierer angeben.

UPDATE: Da Sie das Zeitformat auf der Basis der Gerätespezifikation greifen wollten, könnten Sie das System des Time_12_24 Wert verwenden und Ihr Format aus dem resultierenden Wert bestimmen.

+1

"Ich schlage vor, dass Sie es explizit in Ihrem Formatierer angeben" - Das ist sicherlich eine Option, aber ich hatte gehofft, dass es eine Methode gibt, die es automatisch tun könnte :) –

+0

Dieser Vorschlag war nur, wenn Sie immer anzeigen möchten 24H-Format. Natürlich können Sie immer das Standardgebietsschema der JVM verwenden und das Anzeigeformat "automatisch" bestimmen lassen. – dispake

+1

Ich möchte nicht immer das 24-Stunden-Format anzeigen, aber ich möchte das 24-Stunden-Format anzeigen, wenn der Benutzer das entsprechende Kontrollkästchen in seinen Geräteeinstellungen aktiviert hat. Dies schließt Fälle ein, wenn der Benutzer Locale.US hat. Nehmen wir an, ich habe zwei Fälle: (1) Locale.US und 24-Stunden-Checkbox UNCHECKED, (2) Locale.US und 24-Stunden Checkbox CHECKED. In beiden Fällen gibt SimpleDateFormat.getTimeInstance Stunden im AM/PM-Format zurück, wobei die 24-Stunden-Systemeinstellung ignoriert wird. –

0

Sie sollten wahrscheinlich Ihr eigenes Formatmuster erstellen. Wenn ich mich richtig erinnere, ist das Muster, das Sie verwenden, "HH: mm: ss.SSS", um Ihnen Stunden, Minuten, Sekunden und dreistellige Genauigkeit von Sekundenbruchteilen zu geben.

Siehe die API-Referenzdokumente für SimpleDateFormat.

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

Anstelle von hh kk verwenden.

5

einfachere Lösung ist:

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

Dies korrekt behandelt 12/24 Stunden Benutzereinstellung.

2

Es scheint in Android 5 bis 6.0.1 einen Bug zu sein, wo DateFormat#getTimeInstance(int) eine DateFormat zurückgibt, die die Verwendung von 24-Stunden-Format Einstellung ignoriert. Die anderen Antworten erwähnen eine Reihe von Problemumgehungen für diesen Fehler. Sie können das Problem auf https://code.google.com/p/android/issues/detail?id=181201 verfolgen.