betacode

Руководство 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

Интерфейс Temporal имитирует общую концепцию между понятиями даты (date), времени (time) и смещения по времени (time-offset). Он предоставляет основные методы получения информации от этих объектов.
public interface Temporal extends TemporalAccessor
Интерфейс Temporal расширяется от интерфейса TemporalAccessor, и они немного отличаются:
TemporalAccessor
Моделирует общую концепцию между понятиями даты (date), времени (time), смещения по времени (time-offset), смещения по часовому поясу (zone-offset) и эры (era).
Temporal
Моделирует общую концепцию между понятиями даты (date), времени (time) и смещения по времени (time-offset).
Таким образом, интерфейс Temporal уменьшает количество концепций, которые он представляет, по сравнению с TemporalAccessor. В нем представлены более подробные методы этих концепций.
Список подклассов или enum, реализующих (implement) интерфейс Temporal:

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)

Проверьте, поддерживается ли указанная единица измерения (unit) этим Temporal.
public boolean isSupported(TemporalUnit unit)
Эта проверка необходима перед использованием метода plus(long,TemporalUnit) или minus(long,TemporalUnit). При вызове этих методов с неподдерживаемой единицей измерения будет выдано исключение.
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
Вы также можете использовать метод TemporalUnit.isSupportedBy(Temporal), чтобы проверить, поддерживается ли конкретное TemporalUnit данным Temporal.
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)

Возвращает копию этого Temporal с некоторой информацией, скорректированной указанным объектом TemporalAdjuster.
public default Temporal with(TemporalAdjuster adjuster)
В принципе, существует 2 способа настройки объекта Temporal, из них рекомендуется второй подход:
Temporal adjustedCopy = temporalAdjuster.adjustInto(temporal);  // (1)

Temporal adjustedCopy = temporal.with(temporalAdjuster);           // (2)
Например:
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
Дополнительные примеры см. также в статье о TemporalAdjuster:

5. with(TemporalField, long)

Возвращает копию этого объекта Temporal с измененным указанным полем (field).
public Temporal with(TemporalField field, long newValue)
В некоторых случаях изменение одного поля может сделать другое поле недействительным. Например, 31 января, изменение с января на февраль сделает день месяца (day-of-month) недействительным. Этот метод изменит день месяца на ближайшую действительную дату.
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)

Возвращает копию этого Temporal с добавленным количеством времени.
public default Temporal plus(TemporalAmount amount)
Например:
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
Метод Temporal.plus(TemporalAmount) работает аналогично методу TemporalAmount.addTo(Temporal):
// This method is defined in the TemporalAmount interface:
public Temporal addTo(Temporal temporal)

7. plus(long, TemporalUnit)

Возвращает копию этого Temporal с указанной добавленной суммой по указанной единице измерения.
public Temporal plus(long amountToAdd, TemporalUnit unit)
Например:
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
Метод Temporal.plus(long,TemporalUnit) работает аналогично методу 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)

Возвращает копию этого Temporal с вычитанием указанного количества времени.
public default Temporal minus(TemporalAmount amount)
Например:
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
Метод Temporal.minus(TemporalAmount) работает аналогично методу TemporalAmount.subtractFrom(Temporal):
// This method is defined in the TemporalAmount interface:
public Temporal subtractFrom(Temporal temporal)

9. minus(long, TemporalUnit)

Возвращает копию этого Temporal с указанной суммой, вычтенной из указанной единицы.
public default Temporal minus(long amountToSubtract, TemporalUnit unit)
Например:
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)

Вычисляет количество времени от одного Temporal до другого Temporal в указанных единицах измерения.
(**) Указанная единица измерения должна поддерживаться обоими объектами Temporal, участвующими в методе, иначе будет выдано исключение DateTimeException.
public long until(Temporal endExclusive, TemporalUnit unit)
Например:
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
Вы также можете использовать метод TemporalUnit.between(Temporal,Temporal) в том же случае:
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