Eine Alternative zum Builder-Ansatz von Joda-Time wäre eine musterbasierte Lösung . Dies wird von meiner Bibliothek Time4J angeboten . Beispiel mit der Klasse Duration.Formatter (einige Leerzeichen zur besseren Lesbarkeit hinzugefügt - das Entfernen der Leerzeichen ergibt den gewünschten C # -Stil):
IsoUnit unit = ClockUnit.MILLIS;
Duration<IsoUnit> dur = // normalized duration with multiple components
Duration.of(123456, unit).with(Duration.STD_PERIOD);
Duration.Formatter<IsoUnit> f = // create formatter/parser with optional millis
Duration.Formatter.ofPattern("D'd' h'h' m'm' s[.fff]'s'");
System.out.println(f.format(dur)); // output: 0d 0h 2m 3.456s
Dieser Formatierer kann auch die Dauer von java.time
-API drucken (die Normalisierungsfunktionen dieses Typs sind jedoch weniger leistungsfähig):
System.out.println(f.format(java.time.Duration.ofMillis(123456))); // output: 0d 0h 2m 3.456s
Die Erwartung des OP, dass "123456 ms so lang wie 4d1h3m5s gedruckt werden", wird offensichtlich falsch berechnet. Ich nehme Schlamperei als Grund an. Der oben definierte Dauerformatierer kann auch als Parser verwendet werden. Der folgende Code zeigt, dass "4d1h3m5s" eher entspricht 349385000 = 1000 * (4 * 86400 + 1 * 3600 + 3 * 60 + 5)
:
System.out.println(
f.parse("4d 1h 3m 5s")
.toClockPeriodWithDaysAs24Hours()
.with(unit.only())
.getPartialAmount(unit)); // 349385000
Eine andere Möglichkeit ist die Verwendung der Klasse net.time4j.PrettyTime
(die auch für die lokalisierte Ausgabe und das Drucken relativer Zeiten wie "gestern", "nächsten Sonntag", "vor 4 Tagen" usw. geeignet ist):
String s = PrettyTime.of(Locale.ENGLISH).print(dur, TextWidth.NARROW);
System.out.println(s); // output: 2m 3s 456ms
s = PrettyTime.of(Locale.ENGLISH).print(dur, TextWidth.WIDE);
System.out.println(s); // output: 2 minutes, 3 seconds, and 456 milliseconds
s = PrettyTime.of(Locale.UK).print(dur, TextWidth.WIDE);
System.out.println(s); // output: 2 minutes, 3 seconds and 456 milliseconds
Die Textbreite steuert, ob Abkürzungen verwendet werden oder nicht. Das Listenformat kann auch durch Auswahl des entsprechenden Gebietsschemas gesteuert werden. In Standard-Englisch wird beispielsweise das Oxform-Komma verwendet, in Großbritannien jedoch nicht. Die neueste Version 5.5 von Time4J unterstützt mehr als 90 Sprachen und verwendet Übersetzungen, die auf dem CLDR-Repository (einem Industriestandard) basieren.
Duration
in der vernünftigen Norm ISO 8601 definiert :PnYnMnDTnHnMnS
DabeiP
bedeutet "Punkt" und markiert den Anfang,T
trennt den Datums- und den Zeitabschnitt und dazwischen sind optionale Vorkommen einer Zahl mit einer einzigen -Briefkürzel. Zum BeispielPT4H30M
= viereinhalb Stunden.