Spec-Zone.ru › OpenJDK 17

Интерфейс 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

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

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

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 не гарантирует возвращения той же даты и времени.

Specified by:
plus в интерфейсе Temporal
Parameters:
amount - величина для добавления, не null
Returns:
объект того же типа с выполненной корректировкой, не null
Throws:
DateTimeException - если добавление невозможно
ArithmeticException - если происходит переполнение числовых значений

plus

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

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

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

Specified by:
plus в интерфейсе Temporal
Parameters:
amountToAdd - количество указанного значения для добавления, может быть отрицательным
unit - единица измерения величины для добавления, не null
Returns:
объект того же типа с добавленным указанным периодом, не null
Throws:
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 не гарантирует возвращения той же даты и времени.

Specified by:
minus в интерфейсе Temporal
Parameters:
amount - величина для вычитания, не null
Returns:
объект того же типа с выполненной корректировкой, не null
Throws:
DateTimeException - если вычитание невозможно
ArithmeticException - если происходит переполнение числовых значений

minus

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

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

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

Specified by:
minus в интерфейсе Temporal
Parameters:
amountToSubtract - количество указанного значения для вычитания, может быть отрицательным
unit - единица измерения величины для вычитания, не null
Returns:
объект того же типа с вычтенным указанным периодом, не null
Throws:
DateTimeException - если единицу невозможно вычесть
UnsupportedTemporalTypeException - если единица не поддерживается
ArithmeticException - если происходит переполнение числовых значений

query

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

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

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

Specified by:
query в интерфейсе TemporalAccessor
Type Parameters:
R - тип результата
Parameters:
query - запрос для вызова, не null
Returns:
результат запроса, может быть null (определяется запросом)
Throws:
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);
 

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

Specified by:
adjustInto в интерфейсе TemporalAdjuster
Parameters:
temporal - целевой объект для корректировки, не null
Returns:
откорректированный объект, не null
Throws:
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 в качестве первого аргумента и преобразованного входного временного интервала в качестве второго аргумента.

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

Specified by:
until в интерфейсе Temporal
Parameters:
endExclusive - конечная дата, исключая ее, которая преобразуется в ChronoLocalDate в той же хронологии, не null
unit - единица измерения для измерения величины, не null
Returns:
количество времени между этой датой и конечной датой
Throws:
DateTimeException - если величину невозможно рассчитать или конечный временной интервал невозможно преобразовать в ChronoLocalDate
UnsupportedTemporalTypeException - если единица не поддерживается
ArithmeticException - если происходит переполнение числовых значений

until

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

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

Точки начала и окончания — 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:
значение сравнения, отрицательное, если меньше, положительное, если больше

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, 2021, 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/17/docs/api/java.base/java/time/chrono/ChronoLocalDate.html

Spec-Zone.ru

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