Интерфейс TemporalField
- Все известные реализующие классы:
ChronoField
public interface TemporalField
Дата и время выражаются с помощью полей, которые делят временную шкалу на понятные людям составляющие. Реализации этого интерфейса представляют такие поля.
Наиболее часто используемые единицы определены в ChronoField. Дополнительные поля предоставляются в IsoFields, WeekFields и JulianFields. Поля также можно создавать в коде приложения, реализуя этот интерфейс.
Поле работает с помощью двойной диспетчеризации. Клиентский код вызывает методы объекта даты и времени, например LocalDateTime, которые проверяют, является ли поле ChronoField. Если да, объект даты и времени должен обработать его. В противном случае вызов метода перенаправляется соответствующему методу этого интерфейса.
- Требования к реализации:
- Этот интерфейс необходимо реализовывать осторожно, чтобы обеспечить корректную работу других классов. Все реализации, которые можно создать, должны быть final, неизменяемыми и потокобезопасными. По возможности реализации должны быть
Serializable. Перечисление является столь же эффективным вариантом реализации. - С версии:
- 1.8
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
<R extends Temporal> |
adjustInto |
Возвращает копию указанного временного объекта, в которой установлено значение этого поля. |
TemporalUnit |
getBaseUnit() |
Возвращает единицу измерения поля. |
default String |
getDisplayName |
Возвращает отображаемое название поля для указанной локали. |
long |
getFrom |
Возвращает значение этого поля из указанного временного объекта. |
TemporalUnit |
getRangeUnit() |
Возвращает диапазон, в пределах которого изменяется поле. |
boolean |
isDateBased() |
Проверяет, представляет ли это поле составляющую даты. |
boolean |
isSupportedBy |
Проверяет, поддерживается ли это поле временным объектом. |
boolean |
isTimeBased() |
Проверяет, представляет ли это поле составляющую времени. |
ValueRange |
range() |
Возвращает диапазон допустимых значений поля. |
ValueRange |
rangeRefinedBy |
Возвращает диапазон допустимых значений этого поля, уточняя результат с помощью временного объекта. |
default TemporalAccessor |
resolve |
Разрешает это поле, предоставляя более простой эквивалент или дату. |
String |
toString() |
Возвращает описательное название поля. |
Подробное описание методов
getDisplayName
default String getDisplayName(Locale locale)
Если для локали нет отображаемого названия, необходимо вернуть подходящее значение по умолчанию.
Реализация по умолчанию должна проверить, что локаль не равна null, и вернуть toString().
- Параметры:
-
locale— используемая локаль, не null - Возвращает:
- отображаемое название для локали или подходящее значение по умолчанию, не null
getBaseUnit
TemporalUnit getBaseUnit()
Единица измерения поля — это период, в пределах которого оно изменяется. Например, для поля 'MonthOfYear' единицей измерения являются 'Months'. См. также getRangeUnit().
- Возвращает:
- единицу измерения, определяющую базовую единицу поля, не null
getRangeUnit
TemporalUnit getRangeUnit()
Диапазон поля — это период, в пределах которого поле изменяется. Например, для поля 'MonthOfYear' диапазоном являются 'Years'. См. также getBaseUnit().
Диапазон никогда не равен null. Например, поле 'Year' является сокращением для 'YearOfForever'. Поэтому его единица измерения — 'Years', а диапазон — 'Forever'.
- Возвращает:
- единицу измерения, определяющую диапазон поля, не null
range
ValueRange range()
Все поля можно выразить как целое число типа long. Этот метод возвращает объект, описывающий допустимый диапазон этого значения. Обычно этот метод применим только к календарной системе ISO-8601.
Обратите внимание, что результат описывает только минимальные и максимальные допустимые значения, и не следует делать из него слишком далеко идущих выводов. Например, в диапазоне могут быть значения, недопустимые для этого поля.
- Возвращает:
- диапазон допустимых значений поля, не null
isDateBased
boolean isDateBased()
Поле основано на дате, если его можно получить из EPOCH_DAY. Обратите внимание, что допустимо, если и isDateBased(), и isTimeBased() возвращают false, например, когда поле представляет минуту недели.
- Возвращает:
- true, если это поле является составляющей даты
isTimeBased
boolean isTimeBased()
Поле основано на времени, если его можно получить из NANO_OF_DAY. Обратите внимание, что допустимо, если и isDateBased(), и isTimeBased() возвращают false, например, когда поле представляет минуту недели.
- Возвращает:
- true, если это поле является составляющей времени
isSupportedBy
boolean isSupportedBy(TemporalAccessor temporal)
Этот метод определяет, поддерживает ли временной аксессор это поле. Если метод возвращает false, запросить это поле у временного объекта нельзя.
Этот метод можно использовать двумя эквивалентными способами. Первый — вызвать его напрямую. Второй — использовать TemporalAccessor.isSupported(TemporalField):
// these two lines are equivalent, but the second approach is recommended temporal = thisField.isSupportedBy(temporal); temporal = temporal.isSupported(thisField);Рекомендуется использовать второй подход,
isSupported(TemporalField), поскольку такой код гораздо понятнее. Реализации должны определять поддержку, используя поля, доступные в ChronoField.
- Параметры:
-
temporal— временной объект для проверки, не null - Возвращает:
- true, если у даты и времени можно запросить это поле, иначе false
rangeRefinedBy
ValueRange rangeRefinedBy(TemporalAccessor temporal)
Этот метод использует временной объект, чтобы определить диапазон допустимых значений поля. Он похож на range(), однако уточняет результат с учетом временного объекта. Например, если поле — DAY_OF_MONTH, метод range не дает точного результата, поскольку длина месяца может составлять 28, 29, 30 или 31 день. Использование этого метода с датой позволяет получить точный диапазон, выбрав один из этих четырех вариантов.
Этот метод можно использовать двумя эквивалентными способами. Первый — вызвать его напрямую. Второй — использовать TemporalAccessor.range(TemporalField):
// these two lines are equivalent, but the second approach is recommended temporal = thisField.rangeRefinedBy(temporal); temporal = temporal.range(thisField);Рекомендуется использовать второй подход,
range(TemporalField), поскольку такой код гораздо понятнее. Реализации должны выполнять запросы и вычисления, используя поля, доступные в ChronoField. Если поле не поддерживается, необходимо выбросить UnsupportedTemporalTypeException.
- Параметры:
-
temporal— временной объект, используемый для уточнения результата, не null - Возвращает:
- диапазон допустимых значений этого поля, не null
- Выбрасывает:
-
DateTimeException— если диапазон поля невозможно получить -
UnsupportedTemporalTypeException— если временной объект не поддерживает это поле
getFrom
long getFrom(TemporalAccessor temporal)
Этот метод запрашивает у временного объекта значение данного поля.
Этот метод можно использовать двумя эквивалентными способами. Первый — вызвать его напрямую. Второй — использовать TemporalAccessor.getLong(TemporalField) (или TemporalAccessor.get(TemporalField)):
// these two lines are equivalent, but the second approach is recommended temporal = thisField.getFrom(temporal); temporal = temporal.getLong(thisField);Рекомендуется использовать второй подход,
getLong(TemporalField), поскольку такой код гораздо понятнее. Реализации должны выполнять запросы и вычисления, используя поля, доступные в ChronoField. Если поле не поддерживается, необходимо выбросить UnsupportedTemporalTypeException.
- Параметры:
-
temporal— временной объект для запроса, не null - Возвращает:
- значение этого поля, не null
- Выбрасывает:
-
DateTimeException— если значение поля невозможно получить -
UnsupportedTemporalTypeException— если временной объект не поддерживает это поле -
ArithmeticException— при переполнении числового значения
adjustInto
<R extends Temporal> R adjustInto(R temporal, long newValue)
Этот метод возвращает новый временной объект на основе указанного, в котором изменено значение данного поля. Например, для LocalDate с его помощью можно установить год, месяц или день месяца. Возвращаемый объект имеет тот же наблюдаемый тип, что и указанный объект.
В некоторых случаях изменение поля не имеет однозначного результата. Например, если целевой объект — дата, соответствующая 31 января, то изменение месяца на февраль не дает однозначного результата. В таких случаях реализация отвечает за определение результата. Обычно выбирается предыдущая допустимая дата, то есть в данном примере последний допустимый день февраля.
Этот метод можно использовать двумя эквивалентными способами. Первый — вызвать его напрямую. Второй — использовать Temporal.with(TemporalField, long):
// these two lines are equivalent, but the second approach is recommended temporal = thisField.adjustInto(temporal); temporal = temporal.with(thisField);Рекомендуется использовать второй подход,
with(TemporalField), поскольку такой код гораздо понятнее. Реализации должны выполнять запросы и вычисления, используя поля, доступные в ChronoField. Если поле не поддерживается, необходимо выбросить UnsupportedTemporalTypeException.
Реализации не должны изменять указанный временной объект. Вместо этого необходимо вернуть скорректированную копию исходного объекта. Это обеспечивает эквивалентное безопасное поведение для неизменяемых и изменяемых реализаций.
- Параметры типа:
R— тип объекта Temporal- Параметры:
-
temporal— временной объект для корректировки, не null -
newValue— новое значение поля - Возвращает:
- скорректированный временной объект, не null
- Выбрасывает:
-
DateTimeException— если поле невозможно установить -
UnsupportedTemporalTypeException— если временной объект не поддерживает это поле -
ArithmeticException— при переполнении числового значения
resolve
default TemporalAccessor resolve(Map<TemporalField, Long> fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle)
Этот метод вызывается на этапе разрешения при разборе. Он предназначен для преобразования определенных приложением полей в более стандартные поля, например поля ChronoField, или в дату.
Обычно приложениям не следует вызывать этот метод напрямую.
- Требования к реализации:
- Если реализация представляет поле, которое можно упростить или объединить с другими полями, необходимо реализовать этот метод.
Указанная карта содержит текущее состояние разбора. Карта является изменяемой, и для разрешения поля и связанных с ним полей ее необходимо изменять. Этот метод вызывается во время разбора только в том случае, если карта содержит данное поле, поэтому реализациям следует считать, что оно присутствует.
Разрешение поля включает проверку значения этого поля и, возможно, других полей, а затем обновление карты более простым значением, например
ChronoField, или возврат полностью сформированного объектаChronoLocalDate. При успешном разрешении код должен удалить из карты все разрешенные поля, включая это поле.Например, класс
IsoFieldsсодержит поля квартала года и дня квартала. Реализация этого метода в данном классе разрешает эти два поля вместе сYEARв полностью сформированный объектLocalDate. Перед возвратом объектаLocalDateметод resolve удаляет из карты все три поля.Частично сформированный временной объект используется для запросов хронологии и часового пояса. Как правило, требуется только хронология. Запрос других данных, кроме часового пояса или хронологии, не определен и на него нельзя полагаться. Поведение других методов, таких как
get,getLong,rangeиisSupported, непредсказуемо, а результаты не определены.Если разрешение возможно, но данные недопустимы, для определения подходящего уровня снисходительности следует использовать стиль разрешения; это может потребовать выброса
DateTimeExceptionилиArithmeticException. Если разрешение невозможно, метод resolve должен вернуть null.При разрешении полей времени карта будет изменена, а метод вернет null. При разрешении полей даты метод обычно возвращает дату, изменяя карту и удаляя из нее разрешенные поля. Однако допустимо также разрешить поля даты в другие экземпляры
ChronoField, способные сформировать дату, напримерEPOCH_DAY.В качестве возвращаемого значения принимаются не все реализации
TemporalAccessor. Реализации, вызывающие этот метод, должны приниматьChronoLocalDate,ChronoLocalDateTime,ChronoZonedDateTimeиLocalTime.Реализация по умолчанию должна возвращать null.
- Параметры:
-
fieldValues— карта полей и значений, которую можно изменять, не null -
partialTemporal— частично сформированный временной объект для запроса часового пояса и хронологии; запрос других данных не определен и не рекомендуется, не null -
resolverStyle— запрошенный тип разрешения, не null - Возвращает:
- разрешенный временной объект; null, если разрешение изменило только карту или не было выполнено
- Выбрасывает:
-
ArithmeticException— при переполнении числового значения -
DateTimeException— если при разрешении возникает ошибка. Это исключение нельзя выбрасывать при запросе поля у временного объекта, не проверив предварительно, поддерживается ли оно
toString
String toString()
Название должно иметь формат 'BaseOfRange', например 'MonthOfYear', если только диапазоном поля не является FOREVER; в этом случае указывается только базовая единица, например 'Year' или 'Era'.
© 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/temporal/TemporalField.html