Spec-Zone.ru › OpenJDK 25

Интерфейс 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 дней и один месяц из 5 дней.

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

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

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

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

Вместо этого используйте LocalDate

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

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

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

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

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

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

С момента выпуска:
1.8

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

Модификатор и тип Метод Описание
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)
Возвращает объект того же типа, что и этот объект, с изменённым указанным полем.

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

get, getLong, range

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

timeLineOrder

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

Этот компаратор отличается от сравнения в compareTo(ChronoLocalDate) тем, что сравнивает только лежащую в основе дату, но не хронологию. Это позволяет сравнивать даты в разных календарных системах на основе положения даты на локальной временной шкале. Сравнение выполняется так же, как сравнение количества дней от эпохи.

Возвращает:
компаратор, который сравнивает даты в порядке временной шкалы, игнорируя хронологию
См. также:
  • isAfter(ChronoLocalDate)
  • isBefore(ChronoLocalDate)
  • isEqual(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.

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

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

isSupported

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

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

Набор поддерживаемых единиц измерения определяется хронологией и обычно включает все единицы даты ChronoUnit, кроме 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 — при переполнении числового значения

plus

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 — при переполнении числового значения

plus

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

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

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

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

minus

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 — при переполнении числового значения

minus

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

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

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

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

query

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 — при переполнении числового значения

until

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 и указанная дата. Результат будет отрицательным, если конечная дата предшествует начальной. Знак будет одинаковым для года, месяца и дня.

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

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

Параметры:
endDateExclusive — конечная дата, не включаемая в расчёт; может относиться к любой хронологии, не null
Возвращает:
период между этой датой и конечной датой, не null
Выбрасывает:
DateTimeException — если вычислить период невозможно
ArithmeticException — при переполнении числового значения

format

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

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

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

 return formatter.format(this);
Параметры:
formatter — используемый форматтер, не null
Возвращает:
отформатированную строку даты, не null
Выбрасывает:
DateTimeException — если при форматировании возникла ошибка

atTime

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

Возвращает ChronoLocalDateTime, образованные этой датой и указанным временем. Допустимы все возможные сочетания даты и времени.

Параметры:
localTime — используемое локальное время, не null
Возвращает:
локальные дата и время, образованные этой датой и указанным временем, не null

toEpochDay

default long toEpochDay()
Преобразует эту дату в количество дней от эпохи.

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

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

Возвращает:
эквивалент этой даты в днях от эпохи

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 в качестве компаратора.

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

Указано в:
compareTo в интерфейсе Comparable<ChronoLocalDate>
Параметры:
other — другая дата для сравнения, не null
Возвращает:
значение компаратора: результат сравнения этой локальной даты с other локальной датой и этой хронологии с other хронологией в указанном порядке; возвращается первый ненулевой результат, а если таких результатов нет — ноль
См. также:
  • isBefore(ChronoLocalDate)
  • isAfter(ChronoLocalDate)

isAfter

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

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

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

Параметры:
other — другая дата для сравнения, не null
Возвращает:
true, если эта дата следует за указанной датой

isBefore

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

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

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

Параметры:
other — другая дата для сравнения, не null
Возвращает:
true, если эта дата предшествует указанной дате

isEqual

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

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

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

Параметры:
other — другая дата для сравнения, не null
Возвращает:
true, если лежащая в основе дата совпадает с указанной датой

equals

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

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

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

Переопределяет:
equals в классе Object
Параметры:
obj — объект для проверки; null возвращает false
Возвращает:
true, если эта дата равна другой дате
См. также:
  • Object.hashCode()
  • HashMap

hashCode

int hashCode()
Хеш-код этой даты.
Переопределяет:
hashCode в классе Object
Возвращает:
подходящий хеш-код
См. также:
  • Object.equals(java.lang.Object)
  • System.identityHashCode(Object)

toString

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

Вывод будет содержать полную местную дату.

Переопределяет:
toString в классе Object
Возвращает:
отформатированную дату; не null

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/java.base/java/time/chrono/ChronoLocalDate.html

Spec-Zone.ru

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