codestory

Die Anleitung zu Java Temporal

  1. Temporal
  2. Temporal methods
  3. isSupported(TemporalUnit)
  4. with(TemporalAdjuster)
  5. with(TemporalField, long)
  6. plus(TemporalAmount)
  7. plus(long, TemporalUnit)
  8. minus(TemporalAmount)
  9. minus(long, TemporalUnit)
  10. until(Temporal, TemporalUnit)

1. Temporal

Die Temporal-Interface simuliert ein gemeinsames Konzept zwischen den Konzepten Datum (date), Uhrzeit (time) und Zeitversatz (time-offset). Es bietet grundlegende Methoden zum Abrufen von Informationen aus diesen Objekten.
public interface Temporal extends TemporalAccessor
Die Temporal-Interface geht von der TemporalAccessor-Interface aus, und sie sind ein bisschen anders:
TemporalAccessor
Simulieren Sie ein gemeinsames Konzept zwischen den Konzepten Datum (date), Uhrzeit (time), Zeitversatz (time-offset), Zeitzonenversatz (zone-offset) und Ära (era).
Temporal
Simulieren Sie ein gemeinsames Konzept zwischen den Konzepten Datum (date), Zeit (time) und Zeitversatz (time-offset).
Daher reduziert Interface Temporal die Anzahl der Konzepte, die es im Vergleich zu TemporalAccessor darstellt. Es bietet detailliertere Methoden dieser Konzepte.
Liste der Unterklassen oder enum, die die Temporal-Interface implementieren:

2. Temporal methods

public boolean isSupported(TemporalUnit unit);

public default Temporal with(TemporalAdjuster adjuster)

public Temporal with(TemporalField field, long newValue);

public default Temporal plus(TemporalAmount amount)  

public Temporal plus(long amountToAdd, TemporalUnit unit);

public default Temporal minus(TemporalAmount amount)  

public default Temporal minus(long amountToSubtract, TemporalUnit unit)  

public long until(Temporal endExclusive, TemporalUnit unit);

3. isSupported(TemporalUnit)

Prüfen Sie, ob die angegebene Einheit von diesem Temporal unterstützt wird.
public boolean isSupported(TemporalUnit unit)
Diese Prüfung ist erforderlich, bevor die Methode plus(long,TemporalUnit) oder minus(long,TemporalUnit) verwendet wird. Wenn diese Methoden mit einer nicht unterstützten Unit aufgerufen werden, wird eine Ausnahme ausgelöst.
Temporal_isSupported_x1.java
Temporal localDate = LocalDate.now();

boolean supported = localDate.isSupported(ChronoField.DAY_OF_MONTH);
System.out.println("localDate support DAY_OF_MONTH? " + supported); // true

Temporal localTime = LocalTime.now();

supported = localTime.isSupported(ChronoField.DAY_OF_MONTH);
System.out.println("localTime support DAY_OF_MONTH? " + supported); // false
Sie können auch die TemporalUnit.isSupportedBy(Temporal)-Methode verwenden, um zu überprüfen, ob eine bestimmte TemporalUnit von einer bestimmten Temporal unterstützt wird.
TemporalUnit_isSupportedBy_x1.java
Temporal localDate = LocalDate.now();

boolean supported = ChronoField.DAY_OF_MONTH.isSupportedBy(localDate);
System.out.println("localDate support DAY_OF_MONTH? " + supported); // true

4. with(TemporalAdjuster)

Gibt eine Kopie dieses Temporal-Objekts mit einigen Informationen zurück, die durch das angegebene TemporalAdjuster-Objekt angepasst wurden.
public default Temporal with(TemporalAdjuster adjuster)
Grundsätzlich gibt es 2 Möglichkeiten, ein Objekt Temporal anzupassen, wobei der zweite Ansatz empfohlen wird:
Temporal adjustedCopy = temporalAdjuster.adjustInto(temporal);  // (1)

Temporal adjustedCopy = temporal.with(temporalAdjuster);           // (2)
Zum Beispiel:
Temporal_with_adjuster_ex1.java
// Temporal object:
Temporal localDateTime = LocalDateTime.of(2020, 1, 1, 13, 30, 45);
System.out.println("localDateTime: " + localDateTime); // 2020-01-01T13:30:45

// TemporalAdjuter object:
TemporalAdjuster adjuster = Month.JULY;

LocalDateTime adjustedLocalDateTime = (LocalDateTime) localDateTime.with(adjuster);
System.out.println("adjustedLocalDateTime: " + adjustedLocalDateTime); // 2020-07-01T13:30:45
Weitere Beispiele finden Sie im Artikel TemporalAdjuster:

5. with(TemporalField, long)

Gibt eine Kopie dieses Objekt Temporal zurück, wobei das angegebene Feld geändert wurde.
public Temporal with(TemporalField field, long newValue)
In einigen Fällen kann das Ändern eines Felds dazu führen, dass ein anderes Feld ungültig wird. Wenn Sie beispielsweise am 31. Januar von Januar auf Februar ändern, wird der Tag des Monats ungültig. Diese Methode ändert den Tag des Monats auf das nächste gültige Datum.
Temporal_with_field_ex1.java
// Temporal object:
Temporal localDate1 = LocalDate.of(2020, 1, 15);
System.out.println("localDate1: " + localDate1); // 2020-01-15

Temporal copiedLocalDate1 = localDate1.with(ChronoField.MONTH_OF_YEAR, 2);
System.out.println("copiedLocalDate1: " + copiedLocalDate1); // 2020-02-15
System.out.println();

// Temporal object:
Temporal localDate2 = LocalDate.of(2020, 1, 31);
System.out.println("localDate2: " + localDate2); // 2020-01-31

Temporal copiedLocalDate2 = localDate2.with(ChronoField.MONTH_OF_YEAR, 2);
System.out.println("copiedLocalDate2: " + copiedLocalDate2); // 2020-02-29
  • ChronoField
  • TemporalField

6. plus(TemporalAmount)

Geben Sie eine Kopie von diesem Temporal mit einer hinzugefügten Zeit zurück.
public default Temporal plus(TemporalAmount amount)
Zum Beispiel:
Temporal_plus_amount_ex1.java
Temporal localDateTime = LocalDateTime.of(2020,5,15, 13,30,45);
System.out.println("localDateTime: " + localDateTime); // 2020-05-15T13:30:45
System.out.println();
 
// plus(TemporalAmount amountToAdd)
TemporalAmount amount1 = Period.ofDays(5);
LocalDateTime localDateTime1 = (LocalDateTime) localDateTime.plus(amount1);
System.out.println("localDateTime1: " + localDateTime1); // 2020-05-20T13:30:45
 
// 1 day 2 hours 30 minutes.
TemporalAmount amount2 = Duration.ofMinutes(1* 24 * 60 + 2* 60 + 30);
LocalDateTime localDateTime2 = (LocalDateTime) localDateTime.plus(amount2);
System.out.println("localDateTime2: " + localDateTime2); // 2020-05-16T16:00:45
Die Methode Temporal.plus(TemporalAmount) funktioniert ähnlich wie die Methode TemporalAmount.addTo(Temporal):
// This method is defined in the TemporalAmount interface:
public Temporal addTo(Temporal temporal)

7. plus(long, TemporalUnit)

Geben Sie eine Kopie von diesem Temporal mit der angegebenen Wertschöpfungsmenge zurück.
public Temporal plus(long amountToAdd, TemporalUnit unit)
Zum Beispiel:
Temporal_plus_unit_ex1.java
Temporal localDateTime = LocalDateTime.of(2020, 5, 15, 13, 30, 45);
System.out.println("localDateTime: " + localDateTime); // 2020-05-15T13:30:45
System.out.println();

// plus(long amountToAdd, TemporalUnit unit)
LocalDateTime localDateTime1 = (LocalDateTime) localDateTime.plus(20, ChronoUnit.DAYS);
System.out.println("localDateTime1: " + localDateTime1); // 2020-06-04T13:30:45

// plus(long amountToAdd, TemporalUnit unit)
LocalDateTime localDateTime2 = (LocalDateTime) localDateTime.plus(2, ChronoUnit.WEEKS);
System.out.println("localDateTime2: " + localDateTime2); // 2020-05-29T13:30:45
Die Methode Temporal.plus(long,TemporalUnit) funktioniert ähnlich wie die Methode TemporalUnit.addTo(R,long):
// This method is defined in the TemporalUnit interface:
public <R extends Temporal> R addTo(R temporal, long amount)

8. minus(TemporalAmount)

Gibt eine Kopie von diesem Temporal zurück, wobei die angegebene Zeit abgezogen wurde
public default Temporal minus(TemporalAmount amount)
Zum Beispiel:
Temporal_minus_amount_ex1.java
Temporal localDateTime = LocalDateTime.of(2020,5,15, 13,30,45);
System.out.println("localDateTime: " + localDateTime); // 2020-05-15T13:30:45
System.out.println();
 
// minus(TemporalAmount amountToAdd)
TemporalAmount amount1 = Period.ofDays(5);
LocalDateTime localDateTime1 = (LocalDateTime) localDateTime.minus(amount1);
System.out.println("localDateTime1: " + localDateTime1); // 2020-05-10T13:30:45
 
// 1 day 2 hours 30 minutes.
TemporalAmount amount2 = Duration.ofMinutes(1* 24 * 60 + 2* 60 + 30);
LocalDateTime localDateTime2 = (LocalDateTime) localDateTime.minus(amount2);
System.out.println("localDateTime2: " + localDateTime2); // 2020-05-14T11:00:45
Die Methode Temporal.minus(TemporalAmount) funktioniert ähnlich wie die Methode TemporalAmount.subtractFrom(Temporal):
// This method is defined in the TemporalAmount interface:
public Temporal subtractFrom(Temporal temporal)

9. minus(long, TemporalUnit)

Geben Sie eine Kopie von diesem Temporal zurück, wobei der angegebene Betrag in der angegebenen Einheit abgezogen wird.
public default Temporal minus(long amountToSubtract, TemporalUnit unit)
Zum Beispiel:
Temporal_minus_unit_ex1.java
Temporal localDateTime = LocalDateTime.of(2020, 5, 15, 13, 30, 45);
System.out.println("localDateTime: " + localDateTime); // 2020-05-15T13:30:45
System.out.println();

// minus(long amountToAdd, TemporalUnit unit)
LocalDateTime localDateTime1 = (LocalDateTime) localDateTime.minus(20, ChronoUnit.DAYS);
System.out.println("localDateTime1: " + localDateTime1); // 2020-04-25T13:30:45

// minus(long amountToAdd, TemporalUnit unit)
LocalDateTime localDateTime2 = (LocalDateTime) localDateTime.minus(20, ChronoUnit.HOURS);
System.out.println("localDateTime2: " + localDateTime2); // 2020-05-14T17:30:45

10. until(Temporal, TemporalUnit)

Berechnen Sie die Zeit von einem Temporal zu einem anderen Temporal in den angegebenen Einheiten.
(**) Die angegebene Unit muss von beiden an der Methode beteiligten Objekt Temporal unterstützt werden, sonst wird eine DateTimeException geworfen.
public long until(Temporal endExclusive, TemporalUnit unit)
Zum Beispiel:
Temporal_until_ex1.java
Temporal temporalFrom = LocalDateTime.of(2020, 5, 15, 13, 30, 45);
System.out.println("temporalFrom: " + temporalFrom); // 2020-05-15T13:30:45

Temporal temporalTo = LocalDate.of(2020, 5, 16).atStartOfDay(); // LocalDateTime
System.out.println("temporalTo: " + temporalTo); // 2020-05-16T00:00
System.out.println();

long hourAmount = temporalFrom.until(temporalTo, ChronoUnit.HOURS);
System.out.println("hourAmount: " + hourAmount); // 10
Sie können im gleichen Fall auch die Methode TemporalUnit.between(Temporal,Temporal) verwenden:
TemporalUnit_between_ex1.java
Temporal temporalFrom = LocalDateTime.of(2020, 5, 15, 13, 30, 45);
System.out.println("temporalFrom: " + temporalFrom); // 2020-05-15T13:30:45

Temporal temporalTo = LocalDate.of(2020, 5, 16).atStartOfDay(); // LocalDateTime
System.out.println("temporalTo: " + temporalTo); // 2020-05-16T00:00
System.out.println();

long hourAmount = ChronoUnit.HOURS.between(temporalFrom, temporalTo);
System.out.println("hourAmount: " + hourAmount); // 10