В библиотеке js-joda модель даты строится на строгом разделении
календарных и временных компонентов. Объекты типа LocalDate
и LocalDateTime предоставляют неизменяемое представление
даты, где каждый элемент извлекается через специализированные методы или
универсальный доступ по полям времени.
Архитектура извлечения компонентов опирается на концепцию
TemporalField, позволяющую получать значения как через
высокоуровневые методы, так и через унифицированный интерфейс полей
календаря.
Тип LocalDate представляет дату без времени и часового
пояса. Основные компоненты извлекаются напрямую через методы:
Каждый компонент доступен через строго типизированные методы:
import { LocalDate } from '@js-joda/core';
const date = LocalDate.of(2026, 5, 24);
const year = date.getYear();
const month = date.getMonthValue();
const day = date.getDayOfMonth();
getYear() возвращает календарный год как целое число.
getMonthValue() возвращает номер месяца в диапазоне от 1 до
12. getDayOfMonth() возвращает день месяца в диапазоне от 1
до 31.
Альтернативный доступ к месяцу осуществляется через объект
Month, который предоставляет более выразительное
представление:
const monthEnum = date.getMonth();
В этом случае возвращается не число, а экземпляр перечисления
Month, содержащий дополнительные свойства и методы.
Для работы с календарной структурой часто используются производные компоненты:
const dayOfWeek = date.getDayOfWeek();
const dayOfYear = date.getDayOfYear();
getDayOfWeek() возвращает объект DayOfWeek,
отражающий день недели по ISO-8601 (понедельник = 1, воскресенье =
7).
getDayOfYear() возвращает порядковый номер дня в году,
начиная с 1 января.
Пример анализа календарного положения даты:
import { LocalDate } from '@js-joda/core';
const date = LocalDate.of(2026, 1, 15);
const info = {
year: date.getYear(),
month: date.getMonthValue(),
day: date.getDayOfMonth(),
dayOfWeek: date.getDayOfWeek().toString(),
dayOfYear: date.getDayOfYear()
};
Помимо специализированных методов, js-joda поддерживает универсальный
механизм доступа через ChronoField. Этот подход
используется для динамического извлечения значений и построения
абстрактных календарных операций.
import { LocalDate, ChronoField } from '@js-joda/core';
const date = LocalDate.of(2026, 5, 24);
const year = date.get(ChronoField.YEAR);
const month = date.get(ChronoField.MONTH_OF_YEAR);
const day = date.get(ChronoField.DAY_OF_MONTH);
Механизм get() работает через интерфейс
TemporalAccessor, где каждое поле проверяется на
поддерживаемость конкретным типом даты.
Дополнительно доступны расширенные поля:
const dayOfYear = date.get(ChronoField.DAY_OF_YEAR);
const dayOfWeek = date.get(ChronoField.DAY_OF_WEEK);
Использование ChronoField полезно при построении
универсальных алгоритмов, где тип поля определяется динамически.
LocalDateTime объединяет календарные и временные
компоненты. В отличие от LocalDate, здесь добавляются часы,
минуты, секунды и наносекунды.
import { LocalDateTime } from '@js-joda/core';
const dateTime = LocalDateTime.of(2026, 5, 24, 14, 35, 50);
const year = dateTime.getYear();
const month = dateTime.getMonthValue();
const day = dateTime.getDayOfMonth();
Эти методы полностью совпадают с интерфейсом LocalDate,
так как дата является общей частью обеих моделей.
const hour = dateTime.getHour();
const minute = dateTime.getMinute();
const second = dateTime.getSecond();
const nano = dateTime.getNano();
Каждый компонент соответствует строго определённому диапазону:
LocalDateTime также поддерживает
ChronoField, объединяя доступ к календарным и временным
компонентам:
import { ChronoField } from '@js-joda/core';
const hour = dateTime.get(ChronoField.HOUR_OF_DAY);
const minute = dateTime.get(ChronoField.MINUTE_OF_HOUR);
const second = dateTime.get(ChronoField.SECOND_OF_MINUTE);
Дополнительно доступны абсолютные и производные значения:
const nanoOfDay = dateTime.get(ChronoField.NANO_OF_DAY);
const secondOfDay = dateTime.get(ChronoField.SECOND_OF_DAY);
Эти поля представляют непрерывное время суток, что полезно для вычислений длительностей и интервалов.
Объекты Month и DayOfWeek в js-joda не
являются примитивными числами. Они инкапсулируют логику календаря и
предоставляют дополнительные методы.
const month = date.getMonth();
const length = month.length(false); // количество дней в месяце без учёта високосного года
length(isLeapYear) позволяет учитывать особенности
календаря при работе с февралем.
const dow = date.getDayOfWeek();
const value = dow.getValue();
getValue() возвращает числовое представление дня недели
по ISO-стандарту.
Не все поля доступны для всех типов временных объектов. Для проверки
используется метод isSupported:
import { ChronoField } from '@js-joda/core';
const supported = date.isSupported(ChronoField.HOUR_OF_DAY);
Для LocalDate результат будет отрицательным, так как
объект не содержит временной части.
Для LocalDateTime поддержка времени возвращает
положительные значения:
const supportedTime = dateTime.isSupported(ChronoField.SECOND_OF_MINUTE);
Комбинирование методов позволяет формировать полное представление даты и времени:
import { LocalDateTime } from '@js-joda/core';
const dt = LocalDateTime.of(2026, 5, 24, 14, 35, 50);
const snapshot = {
year: dt.getYear(),
month: dt.getMonthValue(),
day: dt.getDayOfMonth(),
dayOfWeek: dt.getDayOfWeek().getValue(),
hour: dt.getHour(),
minute: dt.getMinute(),
second: dt.getSecond(),
nano: dt.getNano()
};
Такая структура часто используется при сериализации или передаче данных между слоями приложения.
Каждый вызов метода извлечения компонента не изменяет исходный
объект. LocalDate и LocalDateTime остаются
неизменяемыми, что обеспечивает предсказуемость поведения при
многократных операциях доступа.
const original = LocalDate.of(2026, 5, 24);
const year = original.getYear();
const month = original.getMonthValue();
const same = original; // объект не изменён
Эта модель устраняет необходимость копирования при чтении данных и снижает вероятность побочных эффектов.
Извлечённые компоненты часто применяются в арифметических операциях календарного уровня:
const date = LocalDate.of(2026, 5, 24);
const nextYear = date.getYear() + 1;
const isStartOfMonth = date.getDayOfMonth() === 1;
const isWeekend = date.getDayOfWeek().getValue() >= 6;
Такие операции строятся на комбинации извлечения и последующей логики, при этом сама библиотека не выполняет скрытых преобразований.
Система извлечения компонентов в js-joda строится на трёх уровнях:
getYear,
getMonthValue, getHour)Month,
DayOfWeek)ChronoFieldЭта трёхуровневая модель обеспечивает одновременно строгую типизацию, расширяемость и возможность динамического анализа временных значений.