betacode

Руководство Java Temporal

Следуйте за нами на нашей фан-странице, чтобы получать уведомления каждый раз, когда появляются новые статьи. Facebook

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
Maybe you are interested

Это онлайн курс вне вебсайта o7planning, который мы представляем, он включает бесплатные курсы или курсы со скидкой.