Wie kann ich ein "pretty print" Dauer in Java?
Kennt jemand eine Java Bibliothek, die können ganz schön Druck eine Zahl in Millisekunden in der gleichen Weise, dass C# funktioniert?
E. g., 123456 ms als lange gedruckt werden, wie 4d1h3m5s.
- FYI, das format, das Sie scheinen zu beschreiben, ist ein
Duration
definiert die sinnvolle standard, ISO-8601:PnYnMnDTnHnMnS
woP
bedeutet "Zeit" und markiert den AnfangT
trennt das Datum Teil Zeit-Teil, und in zwischen sind optional occurrances einer Reihe mit einem einzelnen Buchstaben bestehende Abkürzung. Zum BeispielPT4H30M
= vier und eine Hälfte Stunden. - Wenn alle Stricke reißen, es ist eine sehr einfache Sache, es selbst zu tun. Verwenden Sie einfach aufeinander folgende Anwendungen von
%
und/
zu split die Anzahl zu teilen. Fast einfacher als einige der vorgeschlagenen Antworten. - Lassen Sie es zur Bibliothek Methoden für die viel sauberer und übersichtlicher code, als mit
/
und%
. - Ja, in den vergangenen 8 Jahren, seit ich diese Frage gestellt (!) Ich habe umgestellt auf joda time das passt zu meinem Anwendungsfall sehr gut
- Die Joda-Time-Projekt ist jetzt im Wartungs-Modus, und berät die migration zu java.Zeit-Klassen gebaut in Java 8 und höher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Joda Time hat eine ziemlich gute Möglichkeit, dies zu tun mit einem PeriodFormatterBuilder.
Quick-Win:
PeriodFormat.getDefault().print(duration.toPeriod());
z.B.
PeriodType.daysTime()
oder.standard()
hat nicht geholfenHab ich baute eine einfache Lösung, die mit Java 8 ist
Duration.toString()
und ein wenig regex:Das Ergebnis Aussehen wird:
Wenn Sie nicht möchten, dass Leerzeichen zwischen, entfernen Sie einfach
replaceAll
.Duration::toString
formatiert ist, nach den gut definierten und gut getragen, ISO-8601 standard.JodaTime hat eine
Zeit
Klasse vertreten kann solche Mengen, und kann gerendert werden (überIsoPeriodFormat
) in Nach ISO8601 format, z.B.PT4D1H3M5S
z.B.Wenn das format nicht, die, die Sie wollen, dann
PeriodFormatterBuilder
können Sie montieren beliebigen layouts, einschließlich Ihrer C#-Stil4d1h3m5s
.new Period(millis).toString()
verwendet dieISOPeriodFormat.standard()
standardmäßig.Apache-commons-lang bietet eine nützliche Klasse zu bekommen, dies auch getan DurationFormatUtils
z.B.
DurationFormatUtils.formatDurationHMS( 15362 * 1000 ) )
=> 4:16:02.000 (H:m:s.millis)DurationFormatUtils.formatDurationISO( 15362 * 1000 ) )
=> P0Y0M0DT4H16M2.000, vgl. Nach ISO8601Mit Java 8 können Sie auch die
toString()
Methode derjava.Zeit.Dauer
zu formatieren, ohne externe Bibliotheken verwenden ISO-8601-Sekunden-basierte Darstellung wie PT8H6M12.345S.Hier ist, wie Sie es tun können mit pure JDK-code:
Ich weiß, das ist vielleicht nicht passend zu Ihrem Anwendungsfall genau, aber PrettyTime könnte hier ganz nützlich sein.
Java 9+
2 d 1h 6m 4s
org.threeten.extra.AmountFormats.wordBased
Den ThreeTen-Extra Projekt, verwaltet von Stephen Colebourne, der Autor des JSR 310, java.Zeit, und Joda-Time, hat eine
AmountFormats
Klasse, die arbeitet mit der standard-Java-8-Datum-Zeit-Klassen. Es ist ziemlich ausführlich aber mit keine option für eine kompaktere Ausgabe.1 minute, 9 seconds and 86 milliseconds
Alternative zu den builder-Ansatz von Joda-Time wäre ein Muster-basierte Lösung. Dies ist meiner Bibliothek Time4J. Beispiel für die Verwendung der Klasse Dauer.Formatter (Hinzugefügt einige Räume für mehr Lesbarkeit - das entfernen der Leerzeichen wird die Ausbeute der gewünschten C#-Stil):
Andere Möglichkeit ist die Verwendung der Klasse
net.time4j.PrettyTime
(das ist auch gut für die lokalisierte Ausgabe und drucken relative Zeiten):Einen Java 8 - version, basierend auf user678573 Antwort:
... da gibt es keine PeriodFormatter in Java 8, und keine Methoden wie getHours, getMinutes, ...
Ich würde gerne sehen, dass eine bessere version für Java 8.