Интерфейс 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- временной объект для корректировки, не null -
newValue- новое значение поля - Возвращает:
- скорректированный временной объект, не null
- Исключения:
-
DateTimeException- если поле нельзя установить -
UnsupportedTemporalTypeException- если поле не поддерживается временным объектом -
ArithmeticException- если происходит переполнение числовых типов
resolve
default TemporalAccessor resolve(Map<TemporalField,Long> fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle)
Этот метод вызывается во время фазы разрешения разбора. Он предназначен для того, чтобы позволить полям, определенным приложением, упростить до более стандартных полей, таких как те, что в ChronoField, или в дату.
Приложения обычно не должны вызывать этот метод напрямую.
- Требования к реализации:
- Если реализация представляет поле, которое можно упростить или объединить с другими, то этот метод должен быть реализован.
Указанная карта содержит текущее состояние разбора. Карта изменяема и должна быть изменена для разрешения поля и всех связанных полей. Этот метод будет вызываться только во время разбора, если карта содержит это поле, и реализации должны поэтому предполагать, что это поле присутствует.
Разрешение поля будет заключаться в просмотре значения этого поля и, возможно, других полей, и либо обновлении карты с более простым значением, таким как
ChronoField, или возвращении полнойChronoLocalDate. Если разрешение успешно, код должен удалить все поля, которые были разрешены из карты, включая это поле.Например, класс
IsoFieldsсодержит поля квартал года и день квартала. Реализация этого метода в этом классе разрешает два поля плюс полеYEARв полнуюLocalDate. Метод resolve удалит все три поля из карты перед возвращениемLocalDate.Частично завершенная временная метка используется для запроса хронологии и зоны. В общем случае потребуется только хронология. Запрос элементов, отличных от зоны или хронологии, не определен и не должен использоваться. Поведение других методов, таких как
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'.
- Переопределяет:
-
toStringв классеObject - Возвращает:
- имя поля, не 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/temporal/TemporalField.html