ChronoLocalDate в библиотеке js-joda
представляет собой расширенный тип даты, который инкапсулирует
календарную дату без привязки к временной зоне и без учета времени
суток. В отличие от стандартного LocalDate, данный
интерфейс является частью более общей хронологической модели, где дата
может принадлежать различным календарным системам (хроникам), а не
только ISO-8601.
Ключевая особенность заключается в том, что
ChronoLocalDate — это абстракция, позволяющая работать с
датами в различных календарях (например, японском, исламском,
буддийском), сохраняя единый интерфейс операций.
В основе ChronoLocalDate лежит понятие
Chronology — календарной системы. В js-joda каждая дата
ассоциируется с конкретной хроникой:
Таким образом, одна и та же дата может иметь разное представление в зависимости от выбранной хроники, но при этом сохраняется единая модель операций.
ChronoLocalDate обладает следующими
характеристиками:
В большинстве случаев напрямую ChronoLocalDate не
создаётся, а получается через конкретную хронику.
Пример через ISO-хронику:
import { LocalDate } from '@js-joda/core';
const date = LocalDate.of(2026, 5, 25);
Преобразование в ChronoLocalDate происходит неявно, так
как LocalDate реализует данный интерфейс.
Для нестандартных календарей используется фабрика хроники:
const chronoDate = SomeChronology.date(2026, 5, 25);
ChronoLocalDate поддерживает стандартный набор
операций:
const newDate = date.plusDays(10);
const prevDate = date.minusMonths(1);
date.isBefore(otherDate);
date.isAfter(otherDate);
date.isEqual(otherDate);
Важно учитывать, что сравнение выполняется на уровне абсолютной временной линии, а не только внутри одной хроники.
date.year();
date.monthValue();
date.dayOfMonth();
Одной из ключевых особенностей является возможность преобразования даты между различными календарными системами:
const isoDate = LocalDate.of(2026, 5, 25);
const otherChronoDate = SomeChronology.from(isoDate);
При этом сохраняется эквивалентность по времени, но меняется представление.
Использование ChronoLocalDate вводит дополнительные
ограничения:
ChronoZonedDateTime представляет собой расширенную
модель даты и времени, включающую:
Это один из наиболее сложных типов в js-joda, предназначенный для работы с глобальными временными данными, где важны как календарь, так и смещение относительно UTC.
Объект объединяет три уровня информации:
Эта комбинация обеспечивает точное позиционирование момента во времени в любой системе отсчета.
Чаще всего используется связывание локального времени с зоной:
import { ZonedDateTime, ZoneId, LocalDateTime } from '@js-joda/core';
const zone = ZoneId.of('Europe/Moscow');
const localDateTime = LocalDateTime.of(2026, 5, 25, 12, 0);
const zoned = ZonedDateTime.of(localDateTime, zone);
Также возможно создание из мгновенного времени:
const zonedFromInstant = ZonedDateTime.ofInstant(instant, zone);
ChronoZonedDateTime позволяет выполнять операции с
учетом переходов зон:
const zone = zoned.zone();
const converted = zoned.withZoneSameInstant(ZoneId.of('Asia/Tokyo'));
const shifted = zoned.withZoneSameLocal(ZoneId.of('Asia/Tokyo'));
Разница между этими операциями фундаментальна:
SameInstant сохраняет абсолютный момент времениSameLocal сохраняет отображаемое локальное времяChronoZonedDateTime поддерживает операции сложения и
вычитания:
const plusHours = zoned.plusHours(5);
const minusDays = zoned.minusDays(2);
При этом учитываются переходы на летнее/зимнее время и особенности календаря зоны.
Одной из ключевых операций является извлечение абсолютного времени:
const instant = zoned.toInstant();
Это позволяет унифицировать все временные представления в глобальную шкалу UTC.
Сравнение осуществляется на основе Instant, а не
локальных значений:
zoned1.isAfter(zoned2);
zoned1.isBefore(zoned2);
Это гарантирует корректность сравнения между различными часовыми поясами.
Как и ChronoLocalDate, данный тип поддерживает разные
хроники. Однако добавляется дополнительная сложность:
ChronoZonedDateTime применяется в случаях, где
необходимо:
Работа с ChronoZonedDateTime требует учета ряда
факторов:
Instant для надежных
вычисленийОба типа являются частью единой хронологической модели:
ChronoLocalDate отвечает только за календарную
датуChronoZonedDateTime расширяет её до полного временного
контекстаПереход между ними происходит через промежуточные представления:
const dateTime = date.atStartOfDay(zone);
или
const date = zoned.toLocalDate();
Такая связка позволяет строить многоуровневые системы времени, где календарь, локальное время и зона существуют как независимые, но совместимые измерения.