tl; dr
Konvertieren Sie Ihre veralteten java.util.Date
Objekte in deren Ersatz java.time.Instant
. Berechnen Sie dann die verstrichene Zeit als Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
ISO 8601 Format: PnYnMnDTnHnMnS
Die sinnvolle Norm ISO 8601 definiert eine präzise Textdarstellung einer Zeitspanne als Anzahl von Jahren, Monaten, Tagen, Stunden usw. Die Norm nennt eine solche Zeitspanne eine Dauer . Das Format ist, PnYnMnDTnHnMnS
wo das P
Mittel "Punkt" bedeutet, das T
den Datumsabschnitt vom Zeitabschnitt trennt und dazwischen Zahlen stehen, gefolgt von einem Buchstaben.
Beispiele:
P3Y6M4DT12H30M5S
drei Jahre, sechs Monate, vier Tage, zwölf Stunden, dreißig Minuten und fünf Sekunden
PT4H30M
Viereinhalb Stunden
java.time
Das in Java 8 und höher integrierte Java.time- Framework ersetzt die problematischen alten java.util.Date
/ java.util.Calendar
Klassen. Die neuen Klassen sind von dem äußerst erfolgreichen Joda-Time- Framework inspiriert , das als Nachfolger gedacht ist. Das Konzept ist ähnlich, aber neu aufgebaut. Definiert durch JSR 310 . Erweitert um das ThreeTen-Extra- Projekt. Siehe das Tutorial .
Moment
Die Instant
Klasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Vermeiden Sie am besten ältere Klassen wie Date
/ Calendar
. Wenn Sie jedoch mit altem Code interagieren müssen , der noch nicht auf java.time aktualisiert wurde , konvertieren Sie hin und her. Rufen Sie neue Konvertierungsmethoden auf, die den alten Klassen hinzugefügt wurden. Rufen Sie java.util.Date
an Instant
, um von a nach a zu wechseln Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Zeitspanne
Die java.time-Klassen haben diese Idee, eine Zeitspanne als Anzahl von Jahren, Monaten, Tagen, Stunden, Minuten, Sekunden in zwei Hälften darzustellen, in zwei Hälften geteilt:
Period
seit Jahren, Monaten, Tagen
Duration
für Tage, Stunden, Minuten, Sekunden
Hier ist ein Beispiel.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Dump zur Konsole.
Beide Period
und Duration
verwenden den ISO 8601- Standard zum Generieren einer String-Darstellung ihres Werts.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
jetzt: 2015-11-26T00: 46: 48.016-05: 00 [Amerika / Montreal] bis Zukunft: 2015-11-26T00: 46: 48.016-05: 00 [Amerika / Montreal] = PT1H3M
Java 9 fügt Methoden hinzu Duration
, um den Tag-, Stunden-, Minuten- und Sekunden-Teil abzurufen.
Sie können die Gesamtzahl der Tage oder Stunden oder Minuten oder Sekunden oder Millisekunden oder Nanosekunden in der gesamten Dauer abrufen.
long totalHours = duration.toHours();
In Java 9 Duration
erhält die Klasse neue Methoden zum Zurückgeben der verschiedenen Teile von Tagen, Stunden, Minuten, Sekunden, Millisekunden / Nanosekunden. Rufen Sie die to…Part
Methoden: toDaysPart()
, toHoursPart()
, und so weiter.
ChronoUnit
Wenn Sie sich nur für eine einfachere, größere Zeitgranularität interessieren, z. B. "Anzahl der verstrichenen Tage", verwenden Sie die ChronoUnit
Aufzählung.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Ein anderes Beispiel.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu java.time.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Woher bekomme ich die java.time-Klassen?
- Java SE 8 und SE 9 und höher
- Eingebaut.
- Teil der Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
- Java SE 6 und SE 7
- Android
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .
Joda-Zeit
UPDATE: Das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Ich lasse diesen Abschnitt für die Geschichte intakt.
Die Joda-Time-Bibliothek verwendet für ihre Standardeinstellungen ISO 8601. Die Period
Klasse analysiert und generiert diese PnYnMnDTnHnMnS-Zeichenfolgen.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
Rendert:
period: PT4H30M