Spec-Zone.ru › OpenJDK 24

Интерфейс 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, является некорректным. Это неверно для всех календарных систем, когда речь идёт о годе эры, и особенно неверно для японской календарной системы, где год эры сбрасывается с правлением каждого нового императора.

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

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

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

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

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

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

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

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

В систему могут быть добавлены дополнительные календарные системы. Подробнее см. 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 поля даты.

Если поле не является 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 - если происходит переполнение числовых значений

плюс

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 - если происходит переполнение числовых значений (определяется запросом)

корректироватьВ

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, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/time/chrono/ChronoLocalDate.html

Spec-Zone.ru

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