Интерфейс 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в предпочтительную календарную систему пользователя и обратно при выводе и парсинге.
Как обсуждалось выше, выполнение вычислений над датой, где правила календарной системы являются подключаемыми, требует навыков и не рекомендуется. К счастью, необходимость выполнения вычислений с датой в произвольной календарной системе крайне редкая. Например, маловероятно, что правила бизнеса схемы аренды книг позволят арендовать на один месяц, где значение месяца зависит от предпочтительной календарной системы пользователя.
Ключевой случай использования вычислений над датой в произвольной календарной системе — создание ежемесячного календаря для отображения и взаимодействия с пользователем. Опять же, это проблема пользовательского интерфейса, и использование этого интерфейса только в нескольких методах слоя пользовательского интерфейса может быть оправдано.
В любой другой части системы, где дата должна обрабатываться в календарной системе, отличной от ISO, сценарий использования обычно указывает, какую календарную систему использовать. Например, приложение может потребоваться рассчитать ближайший исламский или еврейский праздник, что может потребовать манипулирования датой. Этот тип сценария можно обрабатывать следующим образом:
- начать с ISO
LocalDateпередаваемой в метод - преобразовать дату в альтернативную календарную систему, которая в этом случае известна, а не произвольна
- выполнить вычисление
- преобразовать обратно в
LocalDate
TemporalAccessor, если требуется только чтение, или Temporal, если требуется чтение и запись.- Требования к реализации:
- Этот интерфейс должен быть реализован с осторожностью, чтобы обеспечить корректную работу других классов. Все реализуемые классы должны быть final, неизменяемыми и потокобезопасными. Подклассы должны быть Serializable, где это возможно.
В систему могут быть добавлены дополнительные календарные системы. Подробнее см.
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 |
Возвращает объект того же типа, что и этот объект, с измененным указанным полем. |
Методы, объявленные в интерфейсе java.time.temporal.TemporalAccessor
get, getLong, range
Подробное описание методов
timeLineOrder
static Comparator<ChronoLocalDate> timeLineOrder()
ChronoLocalDate в порядке временной линии, игнорируя хронологию. Этот компаратор отличается от сравнения в compareTo(java.time.chrono.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, то результат этого метода получается путем вызова TemporalField.isSupportedBy(TemporalAccessor) передавая this в качестве аргумента. Поддерживается ли поле определяется самим полем.
- Определено в:
-
isSupportedв интерфейсеTemporalAccessor - Параметры:
-
field- поле для проверки, null возвращает false - Возвращает:
- true, если поле может быть запрошено, false в противном случае
isSupported
default boolean isSupported(TemporalUnit unit)
Проверяет, может ли быть добавлено или вычтено указанное измерение к этой дате. Если false, то вызов методов plus(long, TemporalUnit) и minus вызовет исключение.
Набор поддерживаемых единиц определяется хронологией и обычно включает все единицы даты, кроме FOREVER.
Если единица не является ChronoUnit, то результат этого метода получается путем вызова TemporalUnit.isSupportedBy(Temporal) передавая this в качестве аргумента. Поддерживается ли единица определяется самой единицей.
- Определено в:
-
isSupportedв интерфейсеTemporal - Параметры:
-
unit- единица измерения для проверки, null возвращает false - Возвращает:
- true, если единица может быть добавлена/вычтена, false в противном случае
with
default ChronoLocalDate with(TemporalAdjuster adjuster)
Это корректирует эту дату-время согласно правилам указанного корректировщика. Простой корректировщик может просто установить одно из полей, например, поле года. Более сложный корректировщик может установить дату на последнее число месяца. Выбор общих корректировок предоставляется в TemporalAdjusters. Они включают поиск "последнего числа месяца" и "следующей среды". Корректировщик отвечает за обработку особых случаев, таких как переменная длина месяцев и високосных лет.
Некоторые примеры кода, показывающие как и почему используется этот метод:
date = date.with(Month.JULY); // most key classes implement TemporalAdjuster date = date.with(lastDayOfMonth()); // static import from Adjusters date = date.with(next(WEDNESDAY)); // static import from Adjusters and DayOfWeek
- Определено в:
-
withв интерфейсеTemporal - Параметры:
-
adjuster- используемый корректировщик, не null - Возвращает:
- объект того же типа с произведенной корректировкой, не null
- Исключения:
-
DateTimeException- если невозможно произвести корректировку -
ArithmeticException- если происходит переполнение числовых значений
with
default ChronoLocalDate with(TemporalField field, long newValue)
Это возвращает новый объект, основанный на этом объекте, с изменённым значением для указанного поля. Например, в LocalDate, это может использоваться для установки года, месяца или дня месяца. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.
В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет собой дату, представляющую 31 января, а затем месяц изменяется на февраль, это будет неясно. В таких случаях поле отвечает за решение результата. Как правило, оно выбирает предыдущую допустимую дату, которая в этом примере будет последним допустимым числом февраля.
- Определено в:
-
withв интерфейсеTemporal - Параметры:
-
field- поле для установки в результате, не null -
newValue- новое значение поля в результате - Возвращает:
- объект того же типа с установленным указанным полем, не null
- Исключения:
-
DateTimeException- если поле нельзя установить -
UnsupportedTemporalTypeException- если поле не поддерживается -
ArithmeticException- если происходит переполнение числовых значений
плюс
default ChronoLocalDate plus(TemporalAmount amount)
Это корректирует этот временной интервал, добавляя в соответствии с правилами указанной величины. Величина обычно является Period, но может быть любого другого типа, реализующего интерфейс TemporalAmount, например, Duration.
Некоторые примеры кода, показывающие, как и почему используется этот метод:
date = date.plus(period); // add a Period instance date = date.plus(duration); // add a Duration instance date = date.plus(workingDays(6)); // example user-written workingDays method
Обратите внимание, что вызов plus за которым следует minus не гарантирует возвращение той же даты и времени.
- Указано в:
-
plusв интерфейсеTemporal - Параметры:
-
amount- величина для добавления, не null - Возвращает:
- объект того же типа с произведённой корректировкой, не null
- Бросает:
-
DateTimeException- если добавление невозможно -
ArithmeticException- если происходит переполнение чисел
плюс
default ChronoLocalDate plus(long amountToAdd, TemporalUnit unit)
Этот метод возвращает новый объект, основанный на этом объекте, с добавленным указанным периодом. Например, для LocalDate, это можно использовать для добавления количества лет, месяцев или дней. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.
В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет дату 31 января, то добавление одного месяца будет неясно. В таких случаях поле отвечает за разрешение результата. Обычно оно выберет предыдущую допустимую дату, которая в этом примере будет последним допустимым днём февраля.
- Указано в:
-
plusв интерфейсеTemporal - Параметры:
-
amountToAdd- количество указанного измерения для добавления, может быть отрицательным -
unit- измерение количества для добавления, не null - Возвращает:
- объект того же типа с добавленным указанным периодом, не null
- Бросает:
-
DateTimeException- если измерение не может быть добавлено -
ArithmeticException- если происходит переполнение чисел
минус
default ChronoLocalDate minus(TemporalAmount amount)
Это корректирует этот временной интервал, вычитая в соответствии с правилами указанного значения. Величина обычно является Period, но может быть любого другого типа, реализующего интерфейс TemporalAmount, например, Duration.
Некоторые примеры кода, показывающие, как и почему используется этот метод:
date = date.minus(period); // subtract a Period instance date = date.minus(duration); // subtract a Duration instance date = date.minus(workingDays(6)); // example user-written workingDays method
Обратите внимание, что вызов plus за которым следует minus не гарантирует возвращение той же даты и времени.
- Указано в:
-
minusв интерфейсеTemporal - Параметры:
-
amount- величина для вычитания, не null - Возвращает:
- объект того же типа с произведённой корректировкой, не null
- Бросает:
-
DateTimeException- если вычитание невозможно -
ArithmeticException- если происходит переполнение чисел
минус
default ChronoLocalDate minus(long amountToSubtract, TemporalUnit unit)
Этот метод возвращает новый объект, основанный на этом объекте, с вычтенным указанным периодом. Например, для LocalDate, это можно использовать для вычитания количества лет, месяцев или дней. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.
В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет дату 31 марта, то вычитание одного месяца будет неясно. В таких случаях поле отвечает за разрешение результата. Обычно оно выберет предыдущую допустимую дату, которая в этом примере будет последним допустимым днём февраля.
- Указано в:
-
minusв интерфейсеTemporal - Параметры:
-
amountToSubtract- количество указанного измерения для вычитания, может быть отрицательным -
unit- измерение количества для вычитания, не null - Возвращает:
- объект того же типа с вычтенным указанным периодом, не null
- Бросает:
-
DateTimeException- если измерение не может быть вычтено -
UnsupportedTemporalTypeException- если измерение не поддерживается -
ArithmeticException- если происходит переполнение чисел
запрос
default <R> R query(TemporalQuery<R> query)
Это запрашивает эту дату с использованием указанного объекта стратегии запроса. Объект TemporalQuery определяет логику для получения результата. Прочитайте документацию запроса, чтобы понять, каким будет результат этого метода.
Результат этого метода получается путём вызова метода TemporalQuery.queryFrom(TemporalAccessor) на указанном запросе, передав this в качестве аргумента.
- Указано в:
-
queryв интерфейсеTemporalAccessor - Типы параметров:
-
R- тип результата - Параметры:
-
query- запрос для вызова, не null - Возвращает:
- результат запроса, может быть null (определено запросом)
- Бросает:
-
DateTimeException- если запрос невозможен (определено запросом) -
ArithmeticException- если происходит переполнение чисел (определено запросом)
adjustInto
default Temporal adjustInto(Temporal temporal)
Это возвращает временной объект того же наблюдаемого типа, что и входной, с изменённой датой, которая будет такой же, как у этого объекта.
Корректировка эквивалентна использованию Temporal.with(TemporalField, long), передавая ChronoField.EPOCH_DAY в качестве поля.
В большинстве случаев более понятно использовать обратный порядок вызова с помощью Temporal.with(TemporalAdjuster):
// these two lines are equivalent, but the second approach is recommended temporal = thisLocalDate.adjustInto(temporal); temporal = temporal.with(thisLocalDate);
Этот экземпляр неизменяемый и не изменяется этим вызовом метода.
- Указано в:
-
adjustIntoв интерфейсеTemporalAdjuster - Параметры:
-
temporal- целевой объект для корректировки, не null - Возвращает:
- скорректированный объект, не null
- Бросает:
-
DateTimeException- если корректировка невозможна -
ArithmeticException- если происходит переполнение чисел
до
long until(Temporal endExclusive, TemporalUnit unit)
Это вычисляет количество времени между двумя объектами ChronoLocalDate в терминах одного TemporalUnit. Начальная и конечная точки — это this и указанная дата. Результат будет отрицательным, если конец находится до начала. Temporal , переданный в этот метод, преобразуется в ChronoLocalDate с использованием Chronology.date(TemporalAccessor). Вычисление возвращает целое число, представляющее количество полных измерений между двумя датами. Например, количество дней между двумя датами можно вычислить с помощью startDate.until(endDate, DAYS).
Есть два эквивалентных способа использования этого метода. Первый — вызвать этот метод. Второй — использовать TemporalUnit.between(Temporal, Temporal):
// these two lines are equivalent amount = start.until(end, MONTHS); amount = MONTHS.between(start, end);Выбор должен быть сделан на основе того, что делает код более читаемым.
Вычисление реализовано в этом методе для ChronoUnit. Измерения DAYS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES, MILLENNIA и ERAS должны поддерживаться всеми реализациями. Другие значения ChronoUnit будут вызывать исключение.
Если измерение не является ChronoUnit, то результат этого метода получается путём вызова TemporalUnit.between(Temporal, Temporal) с this в качестве первого аргумента и преобразованным входным временным интервалом в качестве второго аргумента.
Этот экземпляр неизменяемый и не изменяется этим вызовом метода.
- Указано в:
-
untilв интерфейсеTemporal - Параметры:
-
endExclusive- конечная дата, исключая её, которая преобразуется вChronoLocalDateв той же хронологии, не null -
unit- измерение, в котором измеряется количество, не null - Возвращает:
- количество времени между этой датой и конечной датой
- Бросает:
-
DateTimeException- если количество не может быть вычислено или конечный временной интервал не может быть преобразован вChronoLocalDate -
UnsupportedTemporalTypeException- если измерение не поддерживается -
ArithmeticException- если происходит переполнение чисел
until
ChronoPeriod until(ChronoLocalDate endDateExclusive)
ChronoPeriod. Это вычисляет период между двумя датами. Все предоставленные хронологии вычисляют период с использованием лет, месяцев и дней, однако API ChronoPeriod позволяет представлять период в других единицах.
Начальная и конечная точки — this и указанная дата. Результат будет отрицательным, если конец находится до начала. Знак минус будет одинаковым в каждом из года, месяца и дня.
Вычисление выполняется с использованием хронологии этой даты. При необходимости входная дата будет преобразована для соответствия.
Этот экземпляр неизменяемый и не затрагивается этим вызовом метода.
- Parameters:
-
endDateExclusive- конечная дата, исключая её, которая может быть в любой хронологии, не null - Returns:
- период между этой датой и конечной датой, не null
- Throws:
-
DateTimeException- если период нельзя вычислить -
ArithmeticException- если происходит переполнение числовых значений
format
default String format(DateTimeFormatter formatter)
Эта дата будет передана форматеру для получения строки.
Реализация по умолчанию должна работать следующим образом:
return formatter.format(this);
- Parameters:
-
formatter- форматер для использования, не null - Returns:
- строка отформатированной даты, не null
- Throws:
-
DateTimeException- если во время печати произошла ошибка
atTime
default ChronoLocalDateTime<?> atTime(LocalTime localTime)
ChronoLocalDateTime. Это возвращает ChronoLocalDateTime, сформированную из этой даты в указанное время. Все возможные комбинации даты и времени являются допустимыми.
- Parameters:
-
localTime- локальное время для использования, не null - Returns:
- локальная дата-время, сформированная из этой даты и указанного времени, не null
toEpochDay
default long toEpochDay()
Epoch Day count — это простая нарастающая счетная единица дней, где день 0 — 1970-01-01 (ISO). Это определение одинаково для всех хронологий, что позволяет выполнять преобразование.
Эта реализация по умолчанию запрашивает поле EPOCH_DAY.
- Returns:
- Эквивалент Эпохи Дня для этой даты
compareTo
default int compareTo(ChronoLocalDate other)
Сравнение основано сначала на базовой дате временной шкалы, затем на хронологии. Оно «совместимо с equals», как определено в Comparable.
Например, порядок сравнения следующий:
2012-12-03 (ISO)2012-12-04 (ISO)2555-12-04 (ThaiBuddhist)2012-12-05 (ISO)
Если все сравниваемые объекты даты находятся в одной хронологии, то дополнительный этап хронологии не требуется, и используется только локальная дата. Чтобы сравнить даты двух TemporalAccessor экземпляров, включая даты в двух разных хронологиях, используйте ChronoField.EPOCH_DAY в качестве компаратора.
Эта реализация по умолчанию выполняет сравнение, определённое выше.
- Specified by:
-
compareToв интерфейсеComparable<ChronoLocalDate> - Parameters:
-
other- другая дата для сравнения, не null - Returns:
- значение компаратора, т. е. сравнение этой локальной даты с локальной датой
otherи этой хронологии с хронологиейother, в порядке, возвращающее первое ненулевое значение, а в противном случае — ноль - See Also:
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:
hashCode
int hashCode()
- Overrides:
-
hashCodeв классеObject - Returns:
- подходящий хеш-код
- See Also:
toString
String toString()
String. Вывод будет включать полную локальную дату.
- Overrides:
-
toStringв классеObject - Returns:
- отформатированная дата, не null
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/time/chrono/ChronoLocalDate.html