Zeitraum und Dauer in Java

1. Übersicht

In diesem kurzen Tutorial werden wir uns zwei neue Klassen für die Arbeit mit in Java 8 eingeführten Daten ansehen: Zeitraum und Dauer .

Beide Klassen können verwendet werden, um eine Zeitspanne darzustellen oder die Differenz zwischen zwei Daten zu bestimmen. Der Hauptunterschied zwischen den beiden Klassen besteht darin, dass Period datumsbasierte Werte verwendet, während Duration zeitbasierte Werte verwendet.

2. Zeitraum Klasse

Die Periodenklasse verwendet die Einheiten Jahr, Monat und Tag, um einen Zeitraum darzustellen.

Wir können ein Period- Objekt als Differenz zwischen zwei Daten erhalten, indem wir die Between () -Methode verwenden:

LocalDate startDate = LocalDate.of(2015, 2, 20); LocalDate endDate = LocalDate.of(2017, 1, 15); Period period = Period.between(startDate, endDate);

Dann können wir die Datumseinheiten des Zeitraums mit den Methoden getYears (), getMonths (), getDays () bestimmen :

LOG.info("Years:" + period.getYears() + " months:" + period.getMonths() + " days:"+period.getDays());

In diesem Fall kann mit der isNegative () -Methode, die true zurückgibt , wenn eine der Einheiten negativ ist, ermittelt werden, ob das endDate höher als das startDate ist :

assertFalse(period.isNegative());

Wenn isNegative () false zurückgibt, liegt das startDate vor dem endDate- Wert.

Eine andere Möglichkeit , ein Periodenobjekt zu erstellen, basiert auf der Anzahl der Tage, Monate, Wochen oder Jahre mit speziellen Methoden:

Period fromUnits = Period.of(3, 10, 10); Period fromDays = Period.ofDays(50); Period fromMonths = Period.ofMonths(5); Period fromYears = Period.ofYears(10); Period fromWeeks = Period.ofWeeks(40); assertEquals(280, fromWeeks.getDays());

Wenn nur einer der Werte vorhanden ist, z. B. mithilfe der ofDays () -Methode, ist der Wert der anderen Einheiten 0.

Bei der ofWeeks () -Methode wird der Parameterwert verwendet, um die Anzahl der Tage durch Multiplizieren mit 7 festzulegen .

Wir können ein Period- Objekt auch erstellen, indem wir eine Textsequenz analysieren , die das Format „PnYnMnD“ haben muss:

Period fromCharYears = Period.parse("P2Y"); assertEquals(2, fromCharYears.getYears()); Period fromCharUnits = Period.parse("P2Y3M5D"); assertEquals(5, fromCharUnits.getDays());

Der Wert der Periode kann mit Methoden der Form plusX () und minusX () erhöht oder verringert werden , wobei X die Datumseinheit darstellt :

assertEquals(56, period.plusDays(50).getDays()); assertEquals(9, period.minusMonths(2).getMonths());

3. Dauer Klasse

Die Duration- Klasse stellt ein Zeitintervall in Sekunden oder Nanosekunden dar und eignet sich am besten für kürzere Zeiträume, wenn mehr Präzision erforderlich ist.

Wir können den Unterschied zwischen zwei Zeitpunkten als Duration- Objekt mithilfe der Between () -Methode bestimmen :

Instant start = Instant.parse("2017-10-03T10:15:30.00Z"); Instant end = Instant.parse("2017-10-03T10:16:30.00Z"); Duration duration = Duration.between(start, end);

Dann können wir die Methoden getSeconds () oder getNanoseconds () verwenden, um den Wert der Zeiteinheiten zu bestimmen:

assertEquals(60, duration.getSeconds());

Alternativ können wir eine Duration-Instanz von zwei LocalDateTime-Instanzen erhalten:

LocalTime start = LocalTime.of(1, 20, 25, 1024); LocalTime end = LocalTime.of(3, 22, 27, 1544); Duration.between(start, end).getSeconds();

Mit der Methode isNegative () kann überprüft werden, ob der Endzeitpunkt höher als der Startzeitpunkt ist:

assertFalse(duration.isNegative());

Wir können auch ein Duration- Objekt basierend auf mehreren Zeiteinheiten erhalten , indem wir die Methoden ofDays (), ofHours (), ofMillis (), ofMinutes (), ofNanos (), ofSeconds () verwenden :

Duration fromDays = Duration.ofDays(1); assertEquals(86400, fromDays.getSeconds()); Duration fromMinutes = Duration.ofMinutes(60);

Um ein Duration- Objekt basierend auf einer Textsequenz zu erstellen , muss dieses die Form „PnDTnHnMn.nS“ haben:

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S"); Duration fromChar2 = Duration.parse("PT10M");

Eine Dauer kann mit toDays (), toHours (), toMillis (), toMinutes () in andere Zeiteinheiten konvertiert werden :

assertEquals(1, fromMinutes.toHours());

Ein Dauerwert kann mit Methoden der Form plusX () oder minusX () erhöht oder verringert werden , wobei X für Tage, Stunden, Millis, Minuten, Nanos oder Sekunden stehen kann:

assertEquals(120, duration.plusSeconds(60).getSeconds()); assertEquals(30, duration.minusSeconds(30).getSeconds());

Wir können auch die Methoden plus () und minus () mit einem Parameter verwenden, der die TemporalUnit angibt, die addiert oder subtrahiert werden soll:

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds()); assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());

4. Fazit

In diesem Tutorial haben wir gezeigt, wie wir die Klassen Period und Duration verwenden können.

Wie immer finden Sie den vollständigen Quellcode der Beispiele auf GitHub.