Ich bin verwirrt. Nachdem ich über diesen Thread gestolpert war , versuchte ich herauszufinden, wie man einen Countdown-Timer formatiert, der das Format hatte hh:mm:ss
.
Hier ist mein Versuch -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
Wenn ich also einen Wert wie versuche 3600000ms
, bekomme ich 01:59:00
, was falsch ist, da es sein sollte 01:00:00
. Natürlich stimmt etwas mit meiner Logik nicht, aber im Moment kann ich nicht sehen, was es ist!
Kann jemand helfen?
Bearbeiten -
Behoben. Hier ist der richtige Weg, um Millisekunden zu hh:mm:ss
formatieren -
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
Das Problem war das TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
. Es hätte TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
stattdessen so sein sollen.
00:59:59
, es sollte sein01:00:00
.Antworten:
Sie waren wirklich nah:
Sie haben Stunden in Millissekunden umgerechnet, indem Sie Minuten anstelle von Stunden verwendet haben .
Übrigens, ich mag Ihre Verwendung der
TimeUnit
API :)Hier ist ein Testcode:
Ausgabe:
Ich habe festgestellt, dass mein Code oben durch die Verwendung einer Moduldivision anstelle einer Subtraktion erheblich vereinfacht werden kann:
Verwendet weiterhin die
TimeUnit
API für alle magischen Werte und liefert genau die gleiche Ausgabe.quelle
.replaceAll("^00:", "")
oder.replaceAll("^00:(00:)?", "")
Stunden hinzu oder entferne sie, wenn beide Null sind."15:00"
und"10:00:23"
verbunden sind; Es werden nur führende Nullen entfernt, da die Übereinstimmung am Beginn der Eingabe durch verankert ist^
.Die generische Methode hierfür ist ziemlich einfach:
quelle
String.format("%
02d:%02d:%02d", h,m,s)
?Wenn Sie Apache Commons verwenden:
quelle
DurationFormatUtils.formatDurationHMS(timeInMS);
Ich habe das benutzt:
Siehe Beschreibung der Klasse Formatierer .
Siehe ausführbares Beispiel mit einer Eingabe von 2400 ms.
quelle
String.format()
ist zeitzonenabhängig . Die ideale richtige Antwort sollte jedoch Zeitzone unabhängig .String.format()
ist zeitzonenabhängig . Die ideale richtige Antwort sollte jedoch Zeitzone unabhängig .Siehe ausführbares Beispiel mit einer Eingabe von 1200 ms.
quelle
quelle
Testergebnisse für die 4 Implementierungen
Da für große Datenmengen viel formatiert werden musste, war die beste Leistung erforderlich. Hier sind die (überraschenden) Ergebnisse:
für (int i = 0; i <1000000; i ++) {FUNCTION_CALL}
Dauer:
formatTimeUnit: 2216 Millis
quelle
StringBuilder
dann hast du den Fehler gemacht, "0" + eine Art "Ruine" zu verwenden. @mre JVMs GC ist extrem gut darin, viele kurzlebige Objekte zuzuweisen und zu sammeln, keine Sorge. Ich gingString.format
ohne führende Null-Logik vor.Nach Bohemians Antwort müssen wir TimeUnit nicht verwenden, um einen bekannten Wert zu finden. Viel optimaler Code wäre
Ich hoffe es hilft
quelle
millisLeft%1000/10
damit wir das Format erhaltenhour:minutes:seconds:milliseconds
millisLeft%1000
quelle
Das hat bei mir mit Kotlin funktioniert
quelle
Java 9
Dies druckt:
Sie machen es richtig, dass Bibliotheksmethoden die Konvertierungen für Sie durchführen.
java.time
, die moderne Java-API für Datum und Uhrzeit, oder genauer gesagt, ihreDuration
Klasse macht es eleganter und weniger fehleranfällig alsTimeUnit
.Die
toMinutesPart
undtoSecondsPart
Methoden, die ich verwendet habe, wurden in Java 9 eingeführt.Java 6, 7 und 8
Die Ausgabe ist die gleiche wie oben.
Frage: Wie kann das in Java 6 und 7 funktionieren?
java.time
integriert.org.threeten.bp
Zeitklassen mit Unterpaketen importieren.Links
java.time
.java.time
zuerst beschrieben wurde.java.time
Java 6 und 7 (ThreeTen für JSR-310).quelle
Der folgende Code führt die Konvertierung in beide Richtungen durch
23: 59: 58: 999 bis 86398999
und dann
86398999 bis 23: 59: 58: 999
quelle
Format: 00: 00: 00.000
Beispiel: 615605 Millisecend
00: 10: 15.605
quelle
Die als richtig gekennzeichnete Antwort hat einen kleinen Fehler.
Zum Beispiel ist dies ein Beispiel für den Wert, den ich bekomme:
Dies ist die Lösung, um das richtige Format zu erhalten:
als Ergebnis ein korrektes Format erhalten:
Eine andere Option, um das Format zu erhalten,
hh:mm:ss
ist nur:quelle
Ich habe es wie in der ersten Antwort gezeigt versucht. Es funktioniert, aber Minus brachte mich in Verwirrung. Meine Antwort von Groovy:
quelle
Für Kotlin
wo
milSecs
ist Millisekundenquelle
Nun, Sie könnten so etwas versuchen:
Millisekunden in einen Zeitwert umwandeln
quelle