Интерфейс 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в предпочитаемую пользователем календарную систему и обратно при форматировании и разборе.
Как обсуждалось выше, выполнение вычислений над датой, если правила календарной системы можно подключать, требует специальных навыков и не рекомендуется. К счастью, необходимость выполнять вычисления над датой в произвольной календарной системе возникает крайне редко. Например, маловероятно, что правила аренды книг в библиотеке будут разрешать аренду на один месяц, причём значение месяца будет зависеть от предпочитаемой пользователем календарной системы.
Один из основных сценариев, требующих вычислений над датой в произвольной календарной системе, — создание календаря по месяцам для отображения и взаимодействия с пользователем. И в этом случае речь идёт о пользовательском интерфейсе, поэтому использование этого интерфейса только в нескольких методах уровня пользовательского интерфейса может быть оправданным.
В любой другой части системы, где дату нужно обрабатывать в календарной системе, отличной от ISO, сценарий обычно указывает, какую календарную систему использовать. Например, приложению может потребоваться вычислить дату следующего исламского или еврейского праздника, что может потребовать обработки даты. Такой сценарий можно реализовать следующим образом:
- начать с даты ISO
LocalDate, переданной методу; - преобразовать дату в другую календарную систему, которая в данном случае известна, а не является произвольной;
- выполнить вычисление;
- преобразовать дату обратно в
LocalDate;
TemporalAccessor, если требуется доступ только для чтения, или Temporal, если требуется доступ для чтения и записи.- Требования к реализации:
- Этот интерфейс следует реализовывать с осторожностью, чтобы обеспечить корректную работу других классов. Все реализации, которые можно создать, должны быть final, неизменяемыми и потокобезопасными. По возможности подклассы должны быть сериализуемыми.
В систему могут быть добавлены дополнительные календарные системы. Подробнее см.
Chronology. - С момента выпуска:
- 1.8
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
default Temporal |
adjustInto |
Настраивает указанный временной объект так, чтобы дата в нём совпадала с датой этого объекта. |
default ChronoLocalDateTime |
atTime |
Объединяет эту дату со временем, чтобы создать ChronoLocalDateTime. |
default int |
compareTo |
Сравнивает эту дату с другой датой, включая хронологию. |
boolean |
equals |
Проверяет, равна ли эта дата другой дате, включая хронологию. |
default String |
format |
Форматирует эту дату с помощью указанного средства форматирования. |
static ChronoLocalDate |
from |
Получает экземпляр ChronoLocalDate из временного объекта. |
Chronology |
getChronology() |
Возвращает хронологию этой даты. |
default Era |
getEra() |
Возвращает эру, определённую хронологией. |
int |
hashCode() |
Хеш-код этой даты. |
default boolean |
isAfter |
Проверяет, позже ли эта дата указанной даты, не учитывая хронологию. |
default boolean |
isBefore |
Проверяет, раньше ли эта дата указанной даты, не учитывая хронологию. |
default boolean |
isEqual |
Проверяет, равна ли эта дата указанной дате, не учитывая хронологию. |
default boolean |
isLeapYear() |
Проверяет, является ли год високосным согласно календарной системе. |
default boolean |
isSupported |
Проверяет, поддерживается ли указанное поле. |
default boolean |
isSupported |
Проверяет, поддерживается ли указанная единица измерения. |
int |
lengthOfMonth() |
Возвращает длину месяца, представленного этой датой, согласно календарной системе. |
default int |
lengthOfYear() |
Возвращает длину года, представленного этой датой, согласно календарной системе. |
default ChronoLocalDate |
minus |
Возвращает объект того же типа, что и этот объект, с вычтенным указанным периодом. |
default ChronoLocalDate |
minus |
Возвращает объект того же типа, что и этот объект, с вычтенным значением. |
default ChronoLocalDate |
plus |
Возвращает объект того же типа, что и этот объект, с добавленным указанным периодом. |
default ChronoLocalDate |
plus |
Возвращает объект того же типа, что и этот объект, с добавленным значением. |
default <R> R |
query |
Выполняет запрос к этой дате с помощью указанного запроса. |
static Comparator |
timeLineOrder() |
Возвращает компаратор, сравнивающий ChronoLocalDate в хронологическом порядке без учёта хронологии. |
default long |
toEpochDay() |
Преобразует эту дату в день эпохи. |
String |
toString() |
Представляет эту дату как String. |
ChronoPeriod |
until |
Вычисляет период между этой и другой датой в виде ChronoPeriod. |
long |
until |
Вычисляет время до другой даты в единицах указанной единицы измерения. |
default ChronoLocalDate |
with |
Возвращает скорректированный объект того же типа, что и этот объект, применив указанную корректировку. |
default ChronoLocalDate |
with |
Возвращает объект того же типа, что и этот объект, с изменённым указанным полем. |
Методы, объявленные в интерфейсе TemporalAccessor
get, getLong, range
Подробное описание методов
timeLineOrder
static Comparator<ChronoLocalDate> timeLineOrder()
ChronoLocalDate в порядке временной шкалы, игнорируя хронологию. Этот компаратор отличается от сравнения в compareTo(ChronoLocalDate) тем, что сравнивает только лежащую в основе дату, но не хронологию. Это позволяет сравнивать даты в разных календарных системах на основе положения даты на локальной временной шкале. Сравнение выполняется так же, как сравнение количества дней от эпохи.
- Возвращает:
- компаратор, который сравнивает даты в порядке временной шкалы, игнорируя хронологию
- См. также:
from
static ChronoLocalDate from(TemporalAccessor temporal)
ChronoLocalDate из объекта временных данных. Этот метод получает локальную дату на основе указанного объекта временных данных. TemporalAccessor представляет собой произвольный набор сведений о дате и времени, который эта фабрика преобразует в экземпляр ChronoLocalDate.
Преобразование извлекает и объединяет хронологию и дату из объекта временных данных. Поведение эквивалентно использованию Chronology.date(TemporalAccessor) с извлечённой хронологией. Реализациям разрешается выполнять оптимизацию, например обращаться к полям, эквивалентным соответствующим объектам.
Сигнатура этого метода соответствует сигнатуре функционального интерфейса TemporalQuery, что позволяет использовать его в качестве запроса через ссылку на метод, ChronoLocalDate::from.
- Параметры:
-
temporal— объект временных данных для преобразования, не null - Возвращает:
- дату, не null
- Выбрасывает:
-
DateTimeException— если преобразование вChronoLocalDateневозможно - См. также:
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.
Например, порядок сравнения будет следующим:
2012-12-03 (ISO)2012-12-04 (ISO)2555-12-04 (ThaiBuddhist)2012-12-05 (ISO)
Если все сравниваемые объекты даты относятся к одной хронологии, дополнительный этап сравнения хронологий не требуется и используются только локальные даты. Чтобы сравнить даты двух экземпляров TemporalAccessor, включая даты из разных хронологий, используйте ChronoField.EPOCH_DAY в качестве компаратора.
Эта реализация по умолчанию выполняет описанное выше сравнение.
- Указано в:
-
compareToв интерфейсеComparable<ChronoLocalDate> - Параметры:
-
other— другая дата для сравнения, не null - Возвращает:
- значение компаратора: результат сравнения этой локальной даты с
otherлокальной датой и этой хронологии сotherхронологией в указанном порядке; возвращается первый ненулевой результат, а если таких результатов нет — ноль - См. также:
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 в качестве компаратора.
hashCode
toString
© 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