Ich möchte eine Dauer in Sekunden mit einem Muster wie H: MM: SS formatieren. Die aktuellen Dienstprogramme in Java sind so konzipiert, dass sie eine Zeit, aber keine Dauer formatieren.
Ich möchte eine Dauer in Sekunden mit einem Muster wie H: MM: SS formatieren. Die aktuellen Dienstprogramme in Java sind so konzipiert, dass sie eine Zeit, aber keine Dauer formatieren.
Wenn Sie eine Version von Java vor 8 verwenden, können Sie Joda Time und verwenden PeriodFormatter
. Wenn Sie wirklich eine Dauer haben (dh eine verstrichene Zeitspanne ohne Bezug auf ein Kalendersystem), sollten Sie diese wahrscheinlich Duration
größtenteils verwenden - Sie können dann anrufen toPeriod
(indem PeriodType
Sie angeben, was auch immer Sie reflektieren möchten, ob 25 Stunden werden) 1 Tag und 1 Stunde oder nicht usw.), um eine zu erhalten, Period
die Sie formatieren können.
Wenn Sie Java 8 oder höher verwenden: Ich würde normalerweise empfehlen java.time.Duration
, die Dauer zu verwenden. Sie können dann aufrufen getSeconds()
oder ähnliches, um bei Bedarf eine Ganzzahl für die Standardzeichenfolgenformatierung gemäß der Antwort von bobince zu erhalten. Sie sollten jedoch auf die Situation achten, in der die Dauer negativ ist, da Sie wahrscheinlich ein einzelnes negatives Vorzeichen in der Ausgabezeichenfolge wünschen . Also so etwas wie:
public static String formatDuration(Duration duration) {
long seconds = duration.getSeconds();
long absSeconds = Math.abs(seconds);
String positive = String.format(
"%d:%02d:%02d",
absSeconds / 3600,
(absSeconds % 3600) / 60,
absSeconds % 60);
return seconds < 0 ? "-" + positive : positive;
}
Die Formatierung auf diese Weise ist relativ einfach, wenn auch ärgerlich manuell. Für das Parsen wird es im Allgemeinen schwieriger ... Sie können Joda Time auch mit Java 8 verwenden, wenn Sie möchten.
Duration
s Methoden:duration.toHours()
,duration.toMinutesPart()
undduration.toSecondsPart()
die seit Java verfügbar ist 9. Und der absolute Wert man verwenden kann zu bekommenduration.abs()
.Wenn Sie keine Bibliotheken ziehen möchten, können Sie einfach einen Formatierer oder eine zugehörige Verknüpfung verwenden, z. gegebene ganzzahlige Anzahl von Sekunden s:
quelle
s/86400, (s%86400)/3600...
bei Bedarfs > 8640
0 (eines Tages):"\u221E"
- unendlichIch benutze die DurationFormatUtils von Apache common wie folgt:
quelle
Dies ist einfacher, da Java 9. A
Duration
immer noch nicht formatierbar ist, aber Methoden zum Abrufen der Stunden, Minuten und Sekunden hinzugefügt werden, was die Aufgabe etwas einfacher macht:Die Ausgabe dieses Snippets lautet:
quelle
quelle
sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
bevor Sie dieformat
Funktion verwenden.Dies mag etwas hackig sein, aber es ist eine gute Lösung, wenn man dies mit Java 8 erreichen möchte
java.time
:quelle
Duration.ofSeconds(20)
), dann würde ich eine bekommenUnsupportedTemporalTypeException
). Ich habe einfach den Code entfernt und überprüft, ob der Unterschied besteht== 01
. Ich dachte,01
es wäre eine Art Maskierungswert, den ich nicht vollständig verstehe. Können Sie das erklären?isSupported
Methode werden die Informationen zurückgegeben, wenn in der vom Menschen lesbaren Zeichenfolge ein gültiges Feld angezeigt werden soll. Jedenfalls ist die "Maskierung" eigentlich keine Maske. Der Code zeigtreturn value!=0l
nichtreturn value!=01
. Bitte verwenden Sie beim nächsten Mal Copy-Paste.TemporalAccessor
darf nicht für längere Zeit missbraucht werden. JSR-310 hat die SchnittstelleTemporalAmount
für diesen Zweck entwickelt.L
zu verwenden, um einenlong
Wert zu kennzeichnen . Es ist so leicht, Kleinbuchstabenl
für Ziffer 1 falsch zu lesen , wie gerade gezeigt wurde.Hier ist ein weiteres Beispiel zum Formatieren der Dauer. Beachten Sie, dass dieses Beispiel sowohl die positive als auch die negative Dauer als positive Dauer anzeigt.
quelle
Diese Antwort verwendet nur
Duration
Methoden und funktioniert mit Java 8:quelle
Wie wäre es mit der folgenden Funktion, die entweder + H: MM: SS oder + H: MM: SS.sss zurückgibt
quelle
Es gibt einen ziemlich einfachen und (IMO) eleganten Ansatz, zumindest für eine Dauer von weniger als 24 Stunden:
DateTimeFormatter.ISO_LOCAL_TIME.format(value.addTo(LocalTime.of(0, 0)))
Formatierer benötigen ein zeitliches Objekt zum Formatieren, sodass Sie eines erstellen können, indem Sie die Dauer zu einer LocalTime von 00:00 (dh Mitternacht) hinzufügen. Auf diese Weise erhalten Sie eine LocalTime, die die Dauer von Mitternacht bis zu dieser Zeit darstellt und dann einfach in der Standardnotation HH: mm: ss formatiert werden kann. Dies hat den Vorteil, dass keine externe Bibliothek erforderlich ist, und verwendet die Bibliothek java.time, um die Berechnung durchzuführen, anstatt die Stunden, Minuten und Sekunden manuell zu berechnen.
quelle
Dies ist eine funktionierende Option.
Rufen Sie die Methode mit auf
Produziert so etwas wie:
quelle
quelle
Meine Bibliothek Time4J bietet eine musterbasierte Lösung (ähnlich
Apache DurationFormatUtils
, aber flexibler):Dieser Code demonstriert die Funktionen zum Behandeln von Stundenüberlauf und Zeichenbehandlung, siehe auch die API des auf Mustern basierenden Dauerformatierers .
quelle
In Scala (ich habe einige andere Versuche gesehen und war nicht beeindruckt):
Sieht ja schrecklich aus? Deshalb verwenden wir IDEs, um dieses Zeug so zu schreiben, dass die Methode (
$toHoursPart
usw.) eine andere Farbe haben.Dies
f"..."
ist einprintf
/String.format
style-String-Interpolator (wodurch die$
Code-Injection funktioniert). Bei einer Ausgabe von wäre1 14:06:32.583
derf
interpolierte String äquivalent zuString.format("1 %02d:%02d:%02d.%03d", 14, 6, 32, 583)
quelle
mit dieser func
quelle
In Scala auf der Lösung von YourBestBet aufbauen, aber vereinfacht:
quelle
In Scala wird keine Bibliothek benötigt:
quelle
Ich habe diesen nicht gesehen, also dachte ich, ich würde ihn hinzufügen:
Es funktioniert nur 24 Stunden, aber das ist es, was ich normalerweise für die Dauer möchte.
quelle