Spec-Zone.ru › OpenJDK 21

Интерфейс ChronoLocalDate

Все суперинтерфейсы:
Comparable<ChronoLocalDate>, Temporal, TemporalAccessor, TemporalAdjuster
Все известные реализующие классы:
HijrahDate, JapaneseDate, LocalDate, MinguoDate, ThaiBuddhistDate
public interface ChronoLocalDate extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDate>
Дата без времени суток или часового пояса в произвольной хронологии, предназначенная для использования в сложных сценариях глобализации.

Большинство приложений должны объявлять сигнатуры методов, поля и переменные как LocalDate, а не этот интерфейс.

Объект ChronoLocalDate — это абстрактное представление даты, где Chronology chronology, или календарная система, является подключаемой. Дата определяется в терминах полей, выраженных TemporalField, где большинство распространённых реализаций определены в ChronoField. Хронология определяет, как работает календарная система, и значение стандартных полей.

Когда использовать этот интерфейс

Дизайн API поощряет использование LocalDate вместо этого интерфейса, даже в том случае, когда приложению нужно работать с несколькими календарными системами.

Эта концепция может показаться неожиданной на первый взгляд, так как естественный способ глобализации приложения может первоначально заключаться в абстракции календарной системы. Однако, как показано ниже, абстракция календарной системы обычно является неверным подходом, приводящим к ошибкам в логике и трудноустранимым ошибкам. Поэтому следует рассматривать это как архитектурное решение для всего приложения, выбирать использование этого интерфейса вместо LocalDate.

Архитектурные вопросы, которые необходимо рассмотреть

Ниже приведены некоторые моменты, которые необходимо учитывать перед использованием этого интерфейса во всем приложении.

1) Приложения, использующие этот интерфейс вместо простого использования LocalDate, имеют значительно больше шансов на появление ошибок. Это связано с тем, что используемая календарная система неизвестна на этапе разработки. Одной из основных причин ошибок является то, что разработчик применяет предположения, основанные на его повседневном знании календарной системы ISO, к коду, который должен обрабатывать любую произвольную календарную систему. В разделе ниже описано, как эти предположения могут вызывать проблемы. Основным механизмом для уменьшения этого повышенного риска ошибок является строгий процесс проверки кода. Это также следует рассматривать как дополнительные затраты на обслуживание на протяжении всего срока службы кода.

2) Этот интерфейс не навязывает неизменяемость реализаций. Хотя примечания реализации указывают, что все реализации должны быть неизменяемыми, в коде или системе типов нет ничего, что навязывало бы это требование. Любой метод, объявленный для приёма ChronoLocalDate, может поэтому получить плохо или злонамеренно написанную изменяемую реализацию.

3) Приложения, использующие этот интерфейс, должны учитывать влияние эр. LocalDate защищает пользователей от концепции эр, гарантируя, что getYear() возвращает пролептический год. Это решение гарантирует, что разработчики могут рассматривать экземпляры LocalDate как состоящие из трёх полей — год, месяц и день месяца. В отличие от этого, пользователи этого интерфейса должны рассматривать даты как состоящие из четырёх полей — эра, год эры, месяц и день месяца. Дополнительное поле эры часто забывается, но оно имеет важное значение для дат в произвольной календарной системе. Например, в японской календарной системе эра представляет правление императора. Всякий раз, когда одно правление заканчивается и начинается другое, год эры сбрасывается до единицы.

4) Единственным согласованным международным стандартом для передачи даты между двумя системами является стандарт ISO-8601, который требует использования календарной системы ISO. Использование этого интерфейса во всём приложении неизбежно приведёт к необходимости передачи даты через сетевой или компонентный интерфейс, потребовавшего специального протокола или формата приложения.

5) Длительное сохранение, такое как в базе данных, почти всегда будет принимать даты только в календарной системе ISO-8601 (или связанной с ней юлианско-григорианской). Передача дат в других календарных системах увеличивает сложность взаимодействия с хранилищем.

6) В большинстве случаев передача ChronoLocalDate по всему приложению не нужна, как обсуждалось в последнем разделе ниже.

Ложные предположения, вызывающие ошибки в коде с несколькими календарными системами

Как указано выше, существует множество вопросов, которые необходимо учитывать при попытке использования и обработки даты в произвольной календарной системе. Вот некоторые из ключевых вопросов.

Код, запрашивающий день месяца и предполагающий, что значение никогда не будет превышать 31, является некорректным. В некоторых календарных системах в некоторых месяцах больше 31 дня.

Код, добавляющий 12 месяцев к дате и предполагающий, что добавился год, является некорректным. В некоторых календарных системах разное количество месяцев, например, 13 в коптской или эфиопской.

Код, добавляющий один месяц к дате и предполагающий, что значение месяца увеличится на единицу или перейдёт к следующему году, является некорректным. В некоторых календарных системах переменное количество месяцев в году, например, в еврейской.

Код, добавляющий один месяц, а затем ещё один, и предполагающий, что день месяца останется близким к исходному значению, является некорректным. В некоторых календарных системах существенная разница между длиной самого длинного месяца и самого короткого. Например, в коптской или эфиопской 12 месяцев по 30 дней и 1 месяц по 5 дней.

Код, добавляющий семь дней и предполагающий, что добавилась неделя, является некорректным. В некоторых календарных системах недели могут быть не из семи дней, например, во французской революционной.

Код, предполагающий, что, поскольку год date1 больше года date2, значит date1 после date2 — некорректный. Это неверно для всех календарных систем, когда речь идёт о годе эры, и особенно неверно для японской календарной системы, где год эры сбрасывается с правлением каждого нового императора.

Код, рассматривающий месяц 1 и день 1 как начало года, является некорректным. Не все календарные системы начинают год, когда значение месяца равно 1.

В общем случае манипулирование датой, и даже запрос даты, открыты для ошибок, когда календарная система неизвестна на этапе разработки. Именно поэтому код, использующий этот интерфейс, должен проходить дополнительную проверку. Это также причина, по которой архитектурное решение избегать использования этого типа интерфейса обычно является правильным.

Использование LocalDate вместо

Основная альтернатива использованию этого интерфейса во всём приложении следующая.
  • Объявляйте все сигнатуры методов, относящихся к датам, в терминах LocalDate.
  • Сохраняйте хронологию (календарную систему) в профиле пользователя или получайте хронологию по пользовательскому региону.
  • Преобразуйте ISO LocalDate в предпочтительную календарную систему пользователя и обратно при выводе и парсинге.
Этот подход рассматривает проблему глобализованных календарных систем как проблему локализации и ограничивает её слоем пользовательского интерфейса. Этот подход согласуется с другими проблемами локализации в платформе Java.

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

Ключевой случай использования вычислений над датой в произвольной календарной системе — создание ежемесячного календаря для отображения и взаимодействия с пользователем. Опять же, это проблема пользовательского интерфейса, и использование этого интерфейса только в нескольких методах слоя пользовательского интерфейса может быть оправдано.

В любой другой части системы, где дата должна обрабатываться в календарной системе, отличной от ISO, сценарий использования обычно указывает, какую календарную систему использовать. Например, приложение может потребоваться рассчитать ближайший исламский или еврейский праздник, что может потребовать манипулирования датой. Этот тип сценария можно обрабатывать следующим образом:

  • начать с ISO LocalDate передаваемой в метод
  • преобразовать дату в альтернативную календарную систему, которая в этом случае известна, а не произвольна
  • выполнить вычисление
  • преобразовать обратно в LocalDate
Разработчики, пишущие фреймворки или библиотеки низкого уровня, также должны избегать этого интерфейса. Вместо этого следует использовать один из двух общих интерфейсов доступа. Используйте TemporalAccessor, если требуется только чтение, или Temporal, если требуется чтение и запись.
Требования к реализации:
Этот интерфейс должен быть реализован с осторожностью, чтобы обеспечить корректную работу других классов. Все реализуемые классы должны быть final, неизменяемыми и потокобезопасными. Подклассы должны быть Serializable, где это возможно.

В систему могут быть добавлены дополнительные календарные системы. Подробнее см. Chronology.

С:
1.8
END_OF_DOCUMENT_MARKER

Краткое описание методов

Модификатор и тип Метод Описание
default Temporal adjustInto(Temporal temporal)
Настраивает указанный временной объект так, чтобы его дата совпадала с датой этого объекта.
default ChronoLocalDateTime<?> atTime(LocalTime localTime)
Объединяет эту дату со временем, чтобы создать ChronoLocalDateTime.
default int compareTo(ChronoLocalDate other)
Сравнивает эту дату с другой датой, включая хронологию.
boolean equals(Object obj)
Проверяет, равна ли эта дата другой дате, включая хронологию.
default String format(DateTimeFormatter formatter)
Форматирует эту дату с использованием указанного форматера.
static ChronoLocalDate from(TemporalAccessor temporal)
Получает экземпляр ChronoLocalDate из временного объекта.
Chronology getChronology()
Получает хронологию этой даты.
default Era getEra()
Получает эру, как определено хронологией.
int hashCode()
Хеш-код для этой даты.
default boolean isAfter(ChronoLocalDate other)
Проверяет, находится ли эта дата после указанной даты, игнорируя хронологию.
default boolean isBefore(ChronoLocalDate other)
Проверяет, находится ли эта дата до указанной даты, игнорируя хронологию.
default boolean isEqual(ChronoLocalDate other)
Проверяет, равна ли эта дата указанной дате, игнорируя хронологию.
default boolean isLeapYear()
Проверяет, является ли год високосным, как определено системой календаря.
default boolean isSupported(TemporalField field)
Проверяет, поддерживается ли указанное поле.
default boolean isSupported(TemporalUnit unit)
Проверяет, поддерживается ли указанный интервал.
int lengthOfMonth()
Возвращает длительность месяца, представленного этой датой, как определено системой календаря.
default int lengthOfYear()
Возвращает длительность года, представленного этой датой, как определено системой календаря.
default ChronoLocalDate minus(long amountToSubtract, TemporalUnit unit)
Возвращает объект того же типа, что и этот объект, с вычтенным указанным периодом.
default ChronoLocalDate minus(TemporalAmount amount)
Возвращает объект того же типа, что и этот объект, с вычтенным значением.
default ChronoLocalDate plus(long amountToAdd, TemporalUnit unit)
Возвращает объект того же типа, что и этот объект, с добавленным указанным периодом.
default ChronoLocalDate plus(TemporalAmount amount)
Возвращает объект того же типа, что и этот объект, с добавленным значением.
default <R> R query(TemporalQuery<R> query)
Запрашивает эту дату с использованием указанного запроса.
static Comparator<ChronoLocalDate> timeLineOrder()
Получает компаратор, который сравнивает ChronoLocalDate в порядке временной шкалы, игнорируя хронологию.
default long toEpochDay()
Преобразует эту дату в эпохальный день.
String toString()
Выводит эту дату как String.
ChronoPeriod until(ChronoLocalDate endDateExclusive)
Вычисляет период между этой датой и другой датой как ChronoPeriod.
long until(Temporal endExclusive, TemporalUnit unit)
Вычисляет количество времени до другой даты в терминах указанного интервала.
default ChronoLocalDate with(TemporalAdjuster adjuster)
Возвращает измененный объект того же типа, что и этот объект, с произведенной корректировкой.
default ChronoLocalDate with(TemporalField field, long newValue)
Возвращает объект того же типа, что и этот объект, с измененным указанным полем.

Методы, объявленные в интерфейсе java.time.temporal.TemporalAccessor

get, getLong, range

Подробное описание методов

timeLineOrder

static Comparator<ChronoLocalDate> timeLineOrder()
Получает компаратор, который сравнивает ChronoLocalDate в порядке временной линии, игнорируя хронологию.

Этот компаратор отличается от сравнения в compareTo(java.time.chrono.ChronoLocalDate) тем, что он сравнивает только базовую дату, а не хронологию. Это позволяет сравнивать даты в разных календарных системах на основе позиции даты на локальной временной линии. Базовое сравнение эквивалентно сравнению эпохи-дня.

Возвращает:
компаратор, который сравнивает в порядке временной линии, игнорируя хронологию
См. также:
  • isAfter(java.time.chrono.ChronoLocalDate)
  • isBefore(java.time.chrono.ChronoLocalDate)
  • isEqual(java.time.chrono.ChronoLocalDate)

from

static ChronoLocalDate from(TemporalAccessor temporal)
Получает экземпляр ChronoLocalDate из временного объекта.

Это получает локальную дату на основе указанного временного объекта. TemporalAccessor представляет собой произвольную совокупность информации о дате и времени, которую этот фабричный метод преобразует в экземпляр ChronoLocalDate.

Преобразование извлекает и объединяет хронологию и дату из временного объекта. Поведение эквивалентно использованию Chronology.date(TemporalAccessor) с извлечённой хронологией. Реализациям разрешается выполнять оптимизации, такие как доступ к тем полям, которые эквивалентны соответствующим объектам.

Этот метод соответствует сигнатуре функционального интерфейса TemporalQuery, позволяя использовать его в качестве запроса с помощью ссылки на метод, ChronoLocalDate::from.

Параметры:
temporal - временной объект для преобразования, не null
Возвращает:
дата, не null
Исключения:
DateTimeException - если невозможно преобразовать в ChronoLocalDate
См. также:
  • Chronology.date(TemporalAccessor)

getChronology

Chronology getChronology()
Возвращает хронологию этой даты.

Chronology представляет календарную систему, используемую в данный момент. Эра и другие поля в ChronoField определяются хронологией.

Возвращает:
хронология, не null

getEra

default Era getEra()
Возвращает эру, как определено хронологией.

Эра, по сути, самая крупная временная единица. Большинство календарных систем имеют одну эпоху, разделяющую временную линию на две эры. Однако некоторые имеют несколько эр, например, по одной на царствование каждого лидера. Точное значение определяется Chronology.

Все корректно реализованные классы Era являются синглтонами, поэтому допустимо писать date.getEra() == SomeChrono.ERA_NAME).

Эта реализация по умолчанию использует Chronology.eraOf(int).

Возвращает:
константу хронологии, относящуюся к данной дате, не null

isLeapYear

default boolean isLeapYear()
Проверяет, является ли год високосным, как определено календарной системой.

Високосный год — это год, продолжительность которого больше обычной. Точное значение определяется хронологией с ограничением, что високосный год должен быть длиннее, чем невисокосный.

Эта реализация по умолчанию использует Chronology.isLeapYear(long).

Возвращает:
true, если дата находится в високосном году, false в противном случае

lengthOfMonth

int lengthOfMonth()
Возвращает длину месяца, представленного этой датой, как определено календарной системой.

Это возвращает длину месяца в днях.

Возвращает:
длину месяца в днях

lengthOfYear

default int lengthOfYear()
Возвращает длину года, представленного этой датой, как определено календарной системой.

Это возвращает длину года в днях.

Реализация по умолчанию использует isLeapYear() и возвращает 365 или 366.

Возвращает:
длину года в днях

isSupported

default boolean isSupported(TemporalField field)
Проверяет, поддерживается ли указанное поле.

Проверяет, может ли быть запрошено указанное поле у этой даты. Если false, то вызов методов range, get и with(TemporalField, long) вызовет исключение.

Набор поддерживаемых полей определяется хронологией и обычно включает все поля даты.

Если поле не является ChronoField, то результат этого метода получается путем вызова TemporalField.isSupportedBy(TemporalAccessor) передавая this в качестве аргумента. Поддерживается ли поле определяется самим полем.

Определено в:
isSupported в интерфейсе TemporalAccessor
Параметры:
field - поле для проверки, null возвращает false
Возвращает:
true, если поле может быть запрошено, false в противном случае

isSupported

default boolean isSupported(TemporalUnit unit)
Проверяет, поддерживается ли указанная единица измерения.

Проверяет, может ли быть добавлено или вычтено указанное измерение к этой дате. Если false, то вызов методов plus(long, TemporalUnit) и minus вызовет исключение.

Набор поддерживаемых единиц определяется хронологией и обычно включает все единицы даты, кроме FOREVER.

Если единица не является ChronoUnit, то результат этого метода получается путем вызова TemporalUnit.isSupportedBy(Temporal) передавая this в качестве аргумента. Поддерживается ли единица определяется самой единицей.

Определено в:
isSupported в интерфейсе Temporal
Параметры:
unit - единица измерения для проверки, null возвращает false
Возвращает:
true, если единица может быть добавлена/вычтена, false в противном случае

with

default ChronoLocalDate with(TemporalAdjuster adjuster)
Возвращает измененный объект того же типа, что и этот объект, с произведенной корректировкой.

Это корректирует эту дату-время согласно правилам указанного корректировщика. Простой корректировщик может просто установить одно из полей, например, поле года. Более сложный корректировщик может установить дату на последнее число месяца. Выбор общих корректировок предоставляется в TemporalAdjusters. Они включают поиск "последнего числа месяца" и "следующей среды". Корректировщик отвечает за обработку особых случаев, таких как переменная длина месяцев и високосных лет.

Некоторые примеры кода, показывающие как и почему используется этот метод:

  date = date.with(Month.JULY);        // most key classes implement TemporalAdjuster
  date = date.with(lastDayOfMonth());  // static import from Adjusters
  date = date.with(next(WEDNESDAY));   // static import from Adjusters and DayOfWeek
 
Определено в:
with в интерфейсе Temporal
Параметры:
adjuster - используемый корректировщик, не null
Возвращает:
объект того же типа с произведенной корректировкой, не null
Исключения:
DateTimeException - если невозможно произвести корректировку
ArithmeticException - если происходит переполнение числовых значений

with

default ChronoLocalDate with(TemporalField field, long newValue)
Возвращает объект того же типа, что и этот объект, с измененным указанным полем.

Это возвращает новый объект, основанный на этом объекте, с изменённым значением для указанного поля. Например, в LocalDate, это может использоваться для установки года, месяца или дня месяца. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.

В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет собой дату, представляющую 31 января, а затем месяц изменяется на февраль, это будет неясно. В таких случаях поле отвечает за решение результата. Как правило, оно выбирает предыдущую допустимую дату, которая в этом примере будет последним допустимым числом февраля.

Определено в:
with в интерфейсе Temporal
Параметры:
field - поле для установки в результате, не null
newValue - новое значение поля в результате
Возвращает:
объект того же типа с установленным указанным полем, не null
Исключения:
DateTimeException - если поле нельзя установить
UnsupportedTemporalTypeException - если поле не поддерживается
ArithmeticException - если происходит переполнение числовых значений

плюс

default ChronoLocalDate plus(TemporalAmount amount)
Возвращает объект того же типа, что и этот объект, с добавленной величиной.

Это корректирует этот временной интервал, добавляя в соответствии с правилами указанной величины. Величина обычно является Period, но может быть любого другого типа, реализующего интерфейс TemporalAmount, например, Duration.

Некоторые примеры кода, показывающие, как и почему используется этот метод:

  date = date.plus(period);                // add a Period instance
  date = date.plus(duration);              // add a Duration instance
  date = date.plus(workingDays(6));        // example user-written workingDays method
 

Обратите внимание, что вызов plus за которым следует minus не гарантирует возвращение той же даты и времени.

Указано в:
plus в интерфейсе Temporal
Параметры:
amount - величина для добавления, не null
Возвращает:
объект того же типа с произведённой корректировкой, не null
Бросает:
DateTimeException - если добавление невозможно
ArithmeticException - если происходит переполнение чисел

плюс

default ChronoLocalDate plus(long amountToAdd, TemporalUnit unit)
Возвращает объект того же типа, что и этот объект, с добавленным заданным периодом.

Этот метод возвращает новый объект, основанный на этом объекте, с добавленным указанным периодом. Например, для LocalDate, это можно использовать для добавления количества лет, месяцев или дней. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.

В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет дату 31 января, то добавление одного месяца будет неясно. В таких случаях поле отвечает за разрешение результата. Обычно оно выберет предыдущую допустимую дату, которая в этом примере будет последним допустимым днём февраля.

Указано в:
plus в интерфейсе Temporal
Параметры:
amountToAdd - количество указанного измерения для добавления, может быть отрицательным
unit - измерение количества для добавления, не null
Возвращает:
объект того же типа с добавленным указанным периодом, не null
Бросает:
DateTimeException - если измерение не может быть добавлено
ArithmeticException - если происходит переполнение чисел

минус

default ChronoLocalDate minus(TemporalAmount amount)
Возвращает объект того же типа, что и этот объект, со значением, вычтенным из него.

Это корректирует этот временной интервал, вычитая в соответствии с правилами указанного значения. Величина обычно является Period, но может быть любого другого типа, реализующего интерфейс TemporalAmount, например, Duration.

Некоторые примеры кода, показывающие, как и почему используется этот метод:

  date = date.minus(period);               // subtract a Period instance
  date = date.minus(duration);             // subtract a Duration instance
  date = date.minus(workingDays(6));       // example user-written workingDays method
 

Обратите внимание, что вызов plus за которым следует minus не гарантирует возвращение той же даты и времени.

Указано в:
minus в интерфейсе Temporal
Параметры:
amount - величина для вычитания, не null
Возвращает:
объект того же типа с произведённой корректировкой, не null
Бросает:
DateTimeException - если вычитание невозможно
ArithmeticException - если происходит переполнение чисел

минус

default ChronoLocalDate minus(long amountToSubtract, TemporalUnit unit)
Возвращает объект того же типа, что и этот объект, с указанным периодом, вычтенным из него.

Этот метод возвращает новый объект, основанный на этом объекте, с вычтенным указанным периодом. Например, для LocalDate, это можно использовать для вычитания количества лет, месяцев или дней. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.

В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет дату 31 марта, то вычитание одного месяца будет неясно. В таких случаях поле отвечает за разрешение результата. Обычно оно выберет предыдущую допустимую дату, которая в этом примере будет последним допустимым днём февраля.

Указано в:
minus в интерфейсе Temporal
Параметры:
amountToSubtract - количество указанного измерения для вычитания, может быть отрицательным
unit - измерение количества для вычитания, не null
Возвращает:
объект того же типа с вычтенным указанным периодом, не null
Бросает:
DateTimeException - если измерение не может быть вычтено
UnsupportedTemporalTypeException - если измерение не поддерживается
ArithmeticException - если происходит переполнение чисел

запрос

default <R> R query(TemporalQuery<R> query)
Запрашивает эту дату с использованием указанного запроса.

Это запрашивает эту дату с использованием указанного объекта стратегии запроса. Объект TemporalQuery определяет логику для получения результата. Прочитайте документацию запроса, чтобы понять, каким будет результат этого метода.

Результат этого метода получается путём вызова метода TemporalQuery.queryFrom(TemporalAccessor) на указанном запросе, передав this в качестве аргумента.

Указано в:
query в интерфейсе TemporalAccessor
Типы параметров:
R - тип результата
Параметры:
query - запрос для вызова, не null
Возвращает:
результат запроса, может быть null (определено запросом)
Бросает:
DateTimeException - если запрос невозможен (определено запросом)
ArithmeticException - если происходит переполнение чисел (определено запросом)

adjustInto

default Temporal adjustInto(Temporal temporal)
Корректирует указанный временной объект, чтобы он имел ту же дату, что и этот объект.

Это возвращает временной объект того же наблюдаемого типа, что и входной, с изменённой датой, которая будет такой же, как у этого объекта.

Корректировка эквивалентна использованию Temporal.with(TemporalField, long), передавая ChronoField.EPOCH_DAY в качестве поля.

В большинстве случаев более понятно использовать обратный порядок вызова с помощью Temporal.with(TemporalAdjuster):

   // these two lines are equivalent, but the second approach is recommended
   temporal = thisLocalDate.adjustInto(temporal);
   temporal = temporal.with(thisLocalDate);
 

Этот экземпляр неизменяемый и не изменяется этим вызовом метода.

Указано в:
adjustInto в интерфейсе TemporalAdjuster
Параметры:
temporal - целевой объект для корректировки, не null
Возвращает:
скорректированный объект, не null
Бросает:
DateTimeException - если корректировка невозможна
ArithmeticException - если происходит переполнение чисел

до

long until(Temporal endExclusive, TemporalUnit unit)
Вычисляет количество времени до другой даты в терминах указанного измерения.

Это вычисляет количество времени между двумя объектами ChronoLocalDate в терминах одного TemporalUnit. Начальная и конечная точки — это this и указанная дата. Результат будет отрицательным, если конец находится до начала. Temporal , переданный в этот метод, преобразуется в ChronoLocalDate с использованием Chronology.date(TemporalAccessor). Вычисление возвращает целое число, представляющее количество полных измерений между двумя датами. Например, количество дней между двумя датами можно вычислить с помощью startDate.until(endDate, DAYS).

Есть два эквивалентных способа использования этого метода. Первый — вызвать этот метод. Второй — использовать TemporalUnit.between(Temporal, Temporal):

   // these two lines are equivalent
   amount = start.until(end, MONTHS);
   amount = MONTHS.between(start, end);
 
Выбор должен быть сделан на основе того, что делает код более читаемым.

Вычисление реализовано в этом методе для ChronoUnit. Измерения DAYS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES, MILLENNIA и ERAS должны поддерживаться всеми реализациями. Другие значения ChronoUnit будут вызывать исключение.

Если измерение не является ChronoUnit, то результат этого метода получается путём вызова TemporalUnit.between(Temporal, Temporal) с this в качестве первого аргумента и преобразованным входным временным интервалом в качестве второго аргумента.

Этот экземпляр неизменяемый и не изменяется этим вызовом метода.

Указано в:
until в интерфейсе Temporal
Параметры:
endExclusive - конечная дата, исключая её, которая преобразуется в ChronoLocalDate в той же хронологии, не null
unit - измерение, в котором измеряется количество, не null
Возвращает:
количество времени между этой датой и конечной датой
Бросает:
DateTimeException - если количество не может быть вычислено или конечный временной интервал не может быть преобразован в ChronoLocalDate
UnsupportedTemporalTypeException - если измерение не поддерживается
ArithmeticException - если происходит переполнение чисел

until

ChronoPeriod until(ChronoLocalDate endDateExclusive)
Вычисляет период между этой датой и другой датой в виде ChronoPeriod.

Это вычисляет период между двумя датами. Все предоставленные хронологии вычисляют период с использованием лет, месяцев и дней, однако API ChronoPeriod позволяет представлять период в других единицах.

Начальная и конечная точки — this и указанная дата. Результат будет отрицательным, если конец находится до начала. Знак минус будет одинаковым в каждом из года, месяца и дня.

Вычисление выполняется с использованием хронологии этой даты. При необходимости входная дата будет преобразована для соответствия.

Этот экземпляр неизменяемый и не затрагивается этим вызовом метода.

Parameters:
endDateExclusive - конечная дата, исключая её, которая может быть в любой хронологии, не null
Returns:
период между этой датой и конечной датой, не null
Throws:
DateTimeException - если период нельзя вычислить
ArithmeticException - если происходит переполнение числовых значений

format

default String format(DateTimeFormatter formatter)
Форматирует эту дату с использованием указанного форматера.

Эта дата будет передана форматеру для получения строки.

Реализация по умолчанию должна работать следующим образом:

  return formatter.format(this);
 
Parameters:
formatter - форматер для использования, не null
Returns:
строка отформатированной даты, не null
Throws:
DateTimeException - если во время печати произошла ошибка

atTime

default ChronoLocalDateTime<?> atTime(LocalTime localTime)
Объединяет эту дату со временем, чтобы создать ChronoLocalDateTime.

Это возвращает ChronoLocalDateTime, сформированную из этой даты в указанное время. Все возможные комбинации даты и времени являются допустимыми.

Parameters:
localTime - локальное время для использования, не null
Returns:
локальная дата-время, сформированная из этой даты и указанного времени, не null

toEpochDay

default long toEpochDay()
Преобразует эту дату в Эпоху Дня.

Epoch Day count — это простая нарастающая счетная единица дней, где день 0 — 1970-01-01 (ISO). Это определение одинаково для всех хронологий, что позволяет выполнять преобразование.

Эта реализация по умолчанию запрашивает поле EPOCH_DAY.

Returns:
Эквивалент Эпохи Дня для этой даты

compareTo

default int compareTo(ChronoLocalDate other)
Сравнивает эту дату с другой датой, включая хронологию.

Сравнение основано сначала на базовой дате временной шкалы, затем на хронологии. Оно «совместимо с equals», как определено в Comparable.

Например, порядок сравнения следующий:

  1. 2012-12-03 (ISO)
  2. 2012-12-04 (ISO)
  3. 2555-12-04 (ThaiBuddhist)
  4. 2012-12-05 (ISO)
Значения #2 и #3 представляют одну и ту же дату на временной шкале. Когда два значения представляют одну и ту же дату, идентификатор хронологии сравнивается для их различения. Этот шаг необходим, чтобы сделать упорядочение «совместимым с equals».

Если все сравниваемые объекты даты находятся в одной хронологии, то дополнительный этап хронологии не требуется, и используется только локальная дата. Чтобы сравнить даты двух TemporalAccessor экземпляров, включая даты в двух разных хронологиях, используйте ChronoField.EPOCH_DAY в качестве компаратора.

Эта реализация по умолчанию выполняет сравнение, определённое выше.

Specified by:
compareTo в интерфейсе Comparable<ChronoLocalDate>
Parameters:
other - другая дата для сравнения, не null
Returns:
значение компаратора, т. е. сравнение этой локальной даты с локальной датой other и этой хронологии с хронологией other, в порядке, возвращающее первое ненулевое значение, а в противном случае — ноль
See Also:
  • isBefore(java.time.chrono.ChronoLocalDate)
  • isAfter(java.time.chrono.ChronoLocalDate)

isAfter

default boolean isAfter(ChronoLocalDate other)
Проверяет, следует ли эта дата после указанной даты, игнорируя хронологию.

Этот метод отличается от сравнения в compareTo(java.time.chrono.ChronoLocalDate) тем, что сравнивает только базовую дату, а не хронологию. Это позволяет сравнивать даты в разных календарных системах на основе их положения на временной шкале. Это эквивалентно использованию date1.toEpochDay() > date2.toEpochDay().

Эта реализация по умолчанию выполняет сравнение на основе эпохи дня.

Parameters:
other - другая дата для сравнения, не null
Returns:
true, если эта дата следует после указанной

isBefore

default boolean isBefore(ChronoLocalDate other)
Проверяет, предшествует ли эта дата указанной дате, игнорируя хронологию.

Этот метод отличается от сравнения в compareTo(java.time.chrono.ChronoLocalDate) тем, что сравнивает только базовую дату, а не хронологию. Это позволяет сравнивать даты в разных календарных системах на основе их положения на временной шкале. Это эквивалентно использованию date1.toEpochDay() < date2.toEpochDay().

Эта реализация по умолчанию выполняет сравнение на основе эпохи дня.

Parameters:
other - другая дата для сравнения, не null
Returns:
true, если эта дата предшествует указанной

isEqual

default boolean isEqual(ChronoLocalDate other)
Проверяет, равна ли эта дата указанной дате, игнорируя хронологию.

Этот метод отличается от сравнения в compareTo(java.time.chrono.ChronoLocalDate) тем, что сравнивает только базовую дату, а не хронологию. Это позволяет сравнивать даты в разных календарных системах на основе их положения на временной шкале. Это эквивалентно использованию date1.toEpochDay() == date2.toEpochDay().

Эта реализация по умолчанию выполняет сравнение на основе эпохи дня.

Parameters:
other - другая дата для сравнения, не null
Returns:
true, если базовая дата равна указанной дате

equals

boolean equals(Object obj)
Проверяет, равна ли эта дата другой дате, включая хронологию.

Сравнивает эту дату с другой, гарантируя, что дата и хронология одинаковы.

Чтобы сравнить даты двух TemporalAccessor экземпляров, включая даты в двух разных хронологиях, используйте ChronoField.EPOCH_DAY в качестве компаратора.

Overrides:
equals в классе Object
Parameters:
obj - объект для проверки, null возвращает false
Returns:
true, если эта дата равна другой дате
See Also:
  • Object.hashCode()
  • HashMap

hashCode

int hashCode()
Хеш-код для этой даты.
Overrides:
hashCode в классе Object
Returns:
подходящий хеш-код
See Also:
  • Object.equals(java.lang.Object)
  • System.identityHashCode(java.lang.Object)

toString

String toString()
Выводит эту дату в виде String.

Вывод будет включать полную локальную дату.

Overrides:
toString в классе Object
Returns:
отформатированная дата, не null

© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/time/chrono/ChronoLocalDate.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API