Руководство Java Temporal
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:
- TemporalAccessor
- LocalDate
- LocalTime
- LocalDateTime
- ZonedDateTime
- OffsetDateTime
- OffsetTime
- Year
- YearMonth
- ThaiBuddhistDate
- MinguoDate
- JapaneseDate
- HijrahDate
- Instant
- ChronoLocalDate
- ChronoLocalDateTime
- ChronoZonedDateTime
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
- ChronoUnit
- TemporalUnit
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)
- ChronoUnit
- TemporalUnit
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
- ChronoUnit
- TemporalUnit
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
- TemporalUnit
- ChronoUnit
Руководства Java Date Time
- Руководство Java ZoneId
- Руководство Java Temporal
- Руководство Java Period
- Руководство Java TemporalAdjusters
- Руководство Java MinguoDate
- Руководство Java TemporalAccessor
- Руководство Java JapaneseEra
- Руководство Java HijrahDate
- Руководство Java Date Time
- Что такое летнее время (DST)?
- Руководство Java LocalDate
- Руководство Java LocalTime
- Руководство Java ZonedDateTime
- Руководство Java JapaneseDate
- Руководство Java Duration
- Руководство Java TemporalQuery
- Руководство Java TemporalAdjuster
- Руководство Java ChronoUnit
- Руководство Java TemporalQueries
Show More
- Руководства Java Web Services
- Руководства Java Servlet/JSP
- Руководства JavaFX
- Руководства Java SWT
- Руководства Oracle Java ADF
- Java Basic
- Руководства Java Collections Framework
- Руководства Java IO
- Руководства Struts2 Framework
- Руководства Spring Boot
- Руководства Spring Cloud
- Руководства Maven
- Руководства Gradle