ChronoField представляет собой набор стандартизированных полей даты и времени, используемых для доступа к отдельным компонентам временных объектов в js-joda. Каждое поле описывает конкретную часть даты или времени, такую как год, месяц, день, час, минута или наносекунда, и предоставляет единый механизм извлечения и анализа этих значений независимо от конкретного типа временного объекта.
В основе ChronoField лежит идея унифицированного доступа к данным календаря. Вместо вызова специализированных методов вроде getFullYear или getMonth в различных объектах, используется единый интерфейс, где поле определяет семантику извлекаемой величины.
ChronoField в js-joda включает набор констант, каждая из которых соответствует определённой временной единице:
Каждое поле не просто обозначает компонент даты, но и содержит информацию о допустимом диапазоне значений, а также о том, поддерживается ли оно конкретным типом временного объекта.
ChronoField используется через методы временных классов js-joda, таких как LocalDate, LocalTime, LocalDateTime и ZonedDateTime. Основные операции включают извлечение значения, проверку поддержки поля и получение диапазона допустимых значений.
Ключевой метод — get(ChronoField.FIELD):
import { LocalDate, ChronoField } from '@js-joda/core';
const date = LocalDate.of(2025, 5, 25);
const year = date.get(ChronoField.YEAR);
const month = date.get(ChronoField.MONTH_OF_YEAR);
const day = date.get(ChronoField.DAY_OF_MONTH);
Каждый вызов возвращает числовое значение соответствующего компонента. При этом доступ осуществляется через единый механизм, что позволяет писать обобщённый код, работающий с разными типами временных объектов.
ChronoField поддерживает обратную операцию: извлечение значения из временного объекта через саму константу поля.
const year = ChronoField.YEAR.getFrom(date);
const month = ChronoField.MONTH_OF_YEAR.getFrom(date);
Этот подход особенно полезен при разработке обобщённых алгоритмов, где поле рассматривается как самостоятельная сущность, способная извлекать данные из различных типов объектов.
Не все временные типы поддерживают все поля ChronoField. Например, LocalDate не содержит времени суток, поэтому поля, связанные с часами, минутами и секундами, для него недоступны.
Для проверки используется метод isSupportedBy:
const date = LocalDate.of(2025, 5, 25);
ChronoField.YEAR.isSupportedBy(date); // true
ChronoField.HOUR_OF_DAY.isSupportedBy(date); // false
Эта проверка предотвращает ошибки выполнения и позволяет динамически адаптировать логику обработки временных данных.
Каждое поле имеет определённый диапазон допустимых значений, который
можно получить через метод range():
const range = ChronoField.MONTH_OF_YEAR.range();
range.getMinimum(); // 1
range.getMaximum(); // 12
Диапазоны используются для валидации данных и построения интерфейсов, где необходимо ограничивать ввод пользователя допустимыми значениями календаря.
Некоторые поля имеют динамический диапазон, зависящий от конкретного объекта. Например, DAY_OF_MONTH может изменяться в зависимости от месяца и високосного года.
ChronoField активно применяется при работе с временными объектами, содержащими только время суток:
import { LocalTime, ChronoField } from '@js-joda/core';
const time = LocalTime.of(14, 35, 50);
const hour = time.get(ChronoField.HOUR_OF_DAY);
const minute = time.get(ChronoField.MINUTE_OF_HOUR);
const second = time.get(ChronoField.SECOND_OF_MINUTE);
В данном контексте ChronoField обеспечивает единый доступ к компонентам времени без необходимости обращения к отдельным методам класса.
LocalDateTime объединяет дату и время, поэтому поддерживает широкий набор полей:
import { LocalDateTime, ChronoField } from '@js-joda/core';
const dt = LocalDateTime.of(2025, 5, 25, 14, 35);
const year = dt.get(ChronoField.YEAR);
const month = dt.get(ChronoField.MONTH_OF_YEAR);
const hour = dt.get(ChronoField.HOUR_OF_DAY);
Такой подход позволяет одинаково работать как с датой, так и с временем в рамках одного объекта.
ChronoField особенно полезен при построении универсальных функций обработки времени. Вместо жёсткой привязки к конкретным методам класса используется параметризация полем:
function extractValue(temporal, field) {
return temporal.get(field);
}
const date = LocalDate.of(2025, 5, 25);
extractValue(date, ChronoField.YEAR);
extractValue(date, ChronoField.DAY_OF_WEEK);
Такая модель позволяет создавать гибкие инструменты анализа временных данных, работающие с любыми реализациями TemporalAccessor.
Использование ChronoField отличается от традиционного вызова методов:
В отличие от прямых методов, ChronoField превращает доступ к данным в декларативную операцию, где значение определяется самим полем, а не методом конкретного класса.
Поле EPOCH_DAY представляет собой количество дней с 1970-01-01 и используется для низкоуровневых вычислений:
const date = LocalDate.of(2025, 5, 25);
const epochDay = date.get(ChronoField.EPOCH_DAY);
Это значение удобно для сравнения дат, вычисления разницы и сериализации в числовом формате.
ChronoField.DAY_OF_WEEK возвращает значение от 1 до 7, где каждая единица соответствует дню недели в ISO-стандарте:
const date = LocalDate.of(2025, 5, 25);
const dow = date.get(ChronoField.DAY_OF_WEEK);
Это поле используется при календарных вычислениях, планировании событий и реализации бизнес-логики, зависящей от структуры недели.
ChronoField.NANO_OF_SECOND обеспечивает доступ к высокоточной части времени:
import { LocalTime, ChronoField } from '@js-joda/core';
const time = LocalTime.of(12, 30, 15, 123456789);
const nano = time.get(ChronoField.NANO_OF_SECOND);
Это поле важно в системах, где требуется точная синхронизация событий или измерение коротких интервалов времени.
Все временные объекты js-joda реализуют интерфейс TemporalAccessor,
который определяет поведение метода get. ChronoField
является стандартным способом взаимодействия с этим интерфейсом.
Это означает, что любой объект, реализующий TemporalAccessor, может быть источником данных для ChronoField, что создаёт единообразную модель доступа к временной информации.
При попытке доступа к неподдерживаемому полю возникает исключение.
Поэтому проверка isSupportedBy становится обязательной в
динамических сценариях:
if (ChronoField.HOUR_OF_DAY.isSupportedBy(date)) {
const hour = date.get(ChronoField.HOUR_OF_DAY);
}
Такой механизм предотвращает логические ошибки при работе с разнородными типами временных данных.
ChronoField выступает связующим звеном между абстрактной моделью времени и конкретными реализациями объектов. Он формализует доступ к компонентам даты и времени, делая его предсказуемым, расширяемым и независимым от конкретных классов.
Использование ChronoField позволяет строить системы обработки времени, в которых логика не привязана к структуре объектов, а определяется набором стандартных полей.