Zeitraum und Dauer in Java

Zeitraum und Dauer in Java

1. Überblick

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

Beide Klassen können verwendet werden, um einen bestimmten Zeitraum darzustellen oder die Differenz zwischen zwei Daten zu bestimmen. Der Hauptunterschied zwischen den beiden Klassen besteht darin, dassPeriod datumsbasierte Werte verwendet, währendDuration zeitbasierte Werte verwendet.

2. Period Klasse

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

Wir können einPeriod-Objekt als Differenz zwischen zwei Daten erhalten, indem wir diebetween()-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 der Periode mit den MethodengetYears(), getMonths(), getDays() bestimmen:

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

In diesem Fall kann mit der MethodeisNegative(), dietrue zurückgibt, wenn eine der Einheiten negativ ist, bestimmt werden, obendDate höher alsstartDate ist:

assertFalse(period.isNegative());

WennisNegative() false zurückgibt, iststartDate früher als der Wert vonendDate.

Ein anderer Weg zucreate a Period object is based on the number of days, months, weeks or years mit dedizierten 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, beispielsweise unter Verwendung derofDays()-Methode, ist der Wert der anderen Einheiten 0.

Bei der MethodeofWeeks() wird der Parameterwert verwendet, um die Anzahl der Tage durch Multiplikation mit 7 festzulegen.

Wir können auchcreate a Period object by parsing a text sequence, die das Format "PnYnMnD" haben müssen:

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 FormplusX() undminusX() erhöht oder verringert werden, wobei X die Datumseinheit darstellt:

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

3. Duration Klasse

Die KlasseDuration 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 alsDuration-Objekt mit derbetween()-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 MethodengetSeconds() odergetNanoseconds() verwenden, um den Wert der Zeiteinheiten zu bestimmen:

assertEquals(60, duration.getSeconds());

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

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

Duration.between(start, end).getSeconds();

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

assertFalse(duration.isNegative());

Wir können auchobtain a Duration object based on several time units mit den MethodenofDays(), ofHours(), ofMillis(), ofMinutes(), ofNanos(), ofSeconds():

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

Duration fromMinutes = Duration.ofMinutes(60);

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

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

A duration can be converted to other time units mittoDays(), toHours(), toMillis(), toMinutes():

assertEquals(1, fromMinutes.toHours());

Ein Dauerwert kann mit Methoden der FormplusX() oderminusX() 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 Methodenplus() undminus() mit einem Parameter verwenden, der dieTemporalUnit angibt, die addiert oder subtrahiert werden sollen:

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 KlassenPeriod undDurationverwenden können.

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