Was ist der Unterschied zwischen den Formaten kk: mm, HH: mm und hh: mm?
SimpleDateFormat broken = new SimpleDateFormat("kk:mm:ss");
broken.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
SimpleDateFormat working = new SimpleDateFormat("HH:mm:ss");
working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
SimpleDateFormat working2 = new SimpleDateFormat("hh:mm:ss");
working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
System.out.println(broken.format(Epoch));
System.out.println(working.format(Epoch));
System.out.println(working2.format(Epoch));
druckt:
24:00:00
00:00:00
05:30:00
kk: (01-24) sieht aus wie 01, 02..24.
HH: (00-23) wird wie 00, 01..23 aussehen.
hh: (01-12 in AM/PM) sieht aus wie 01, 02..12.
der letzte Ausdruck (working2
) ist also etwas komisch. Es sollte 12:00:00 (Bearbeiten: Wenn Sie die working2
-Zeitzone und das Format einstellen, die (wie von kdagli ausgeführt wurde) nicht angegeben werden.
Bitte schau hier
HH ist Stunde in einem Tag (von 0 bis 23)
hh sind Stunden im Format am/pm
kk ist Stunde pro Tag (von 1 bis 24)
mm ist Minute in Stunde
ss sind die Sekunden in einer Minute
Eigentlich ist der letzte nicht komisch. Code setzt die Zeitzone für working anstelle von working2.
SimpleDateFormat working2 = new SimpleDateFormat("hh:mm:ss");
working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
kk geht von 1 bis 24, HH von 0 bis 23 und hh von 1 bis 12 (AM/PM).
Wenn Sie diesen Fehler beheben, erhalten Sie Folgendes:
24:00:00
00:00:00
01:00:00
h/H = 12/24 Stunden .__ bedeutet, dass Sie das Format hh: mm = 12 Stunden und HH: mm = 24 Stunden schreiben
Wenn dies dazu dient, einem Benutzer eine Uhrzeit zu zeigen, brauchen Sie sich in mindestens 19 von 20 Fällen nicht kk
, HH
oder hh
zu kümmern. Ich schlage vor, dass Sie so etwas verwenden:
DateTimeFormatter defaultTimeFormatter
= DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
System.out.format("%s: %s%n",
Locale.getDefault(), LocalTime.MIN.format(defaultTimeFormatter));
Der Punkt ist, dass es unterschiedliche Ausgabe in verschiedenen Standard-Gebietsschemas gibt. Zum Beispiel:
en_SS: 12:00 AM fr_BL: 00:00 ps_AF: 0:00 es_CO: 12:00 a.m.
Die lokalisierten Formate wurden so gestaltet, dass sie den Erwartungen der verschiedenen Kulturen entsprechen. Sie bieten dem Benutzer also in der Regel eine bessere Benutzererfahrung, und Sie müssen keine Formatmusterzeichenfolge schreiben, die immer fehleranfällig ist.
Ich schlage außerdem vor, dass Sie SimpleDateFormat
nicht verwenden. Diese Klasse ist bekanntermaßen lästig und zum Glück längst überholt. Stattdessen verwende ich Java.time, die moderne Java-API für Datum und Uhrzeit. Es ist viel schöner, damit zu arbeiten.
Wenn Sie eine Zeichenfolge mit einem bestimmten Format analysieren müssen und auch sehr spezifische Formatierungsanforderungen haben, empfiehlt es sich, eine Formatmusterzeichenfolge zu verwenden. Es gibt vier verschiedene Musterbuchstaben, aus denen Sie stundenlang auswählen können (zitiert aus der Dokumentation):
Symbol Meaning Presentation Examples
------ ------- ------------ -------
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-day (1-24) number 24
H hour-of-day (0-23) number 0
In der Praxis werden H
und h
verwendet. Soweit ich weiß, sind k
und K
nicht (sie wurden möglicherweise der Vollständigkeit halber eingeschlossen). Aber sehen wir sie alle in Aktion:
DateTimeFormatter timeFormatter
= DateTimeFormatter.ofPattern("hh:mm a HH:mm kk:mm KK:mm a", Locale.ENGLISH);
System.out.println(LocalTime.of(0, 0).format(timeFormatter));
System.out.println(LocalTime.of(1, 15).format(timeFormatter));
System.out.println(LocalTime.of(11, 25).format(timeFormatter));
System.out.println(LocalTime.of(12, 35).format(timeFormatter));
System.out.println(LocalTime.of(13, 40).format(timeFormatter));
12:00 AM 00:00 24:00 00:00 AM 01:15 AM 01:15 01:15 01:15 AM 11:25 AM 11:25 11:25 11:25 AM 12:35 PM 12:35 12:35 00:35 PM 01:40 PM 13:40 13:40 01:40 PM
Wenn Sie die führende Null nicht wünschen, geben Sie einfach einen Buchstaben an, der h
anstelle von hh
oder H
statt HH
ist. Bei der Analyse werden immer noch zwei Ziffern akzeptiert. Wenn eine zu druckende Zahl größer als 9 ist, werden immer noch zwei Ziffern gedruckt.
DateTimeFormatter
.