В библиотеке js-joda хронология определяет календарную систему, по
правилам которой интерпретируются даты, месяцы, годы и эпохи.
IsoChronology представляет стандартную международную
календарную систему ISO-8601 — именно она используется большинством
приложений, баз данных, API и интернет-протоколов.
ISO-хронология основана на:
Практически все основные классы js-joda работают именно
через IsoChronology:
LocalDateLocalDateTimeZonedDateTimeOffsetDateTimeYearMonthDayPeriodconst { IsoChronology } = require('@js-joda/core')
ESM-вариант:
import { IsoChronology } from '@js-joda/core'
Внутри библиотеки существует абстрактная система календарей:
| Компонент | Назначение |
|---|---|
Chronology |
Базовый интерфейс календарной системы |
IsoChronology |
Реализация ISO-8601 |
ChronoLocalDate |
Абстрактная дата в любой хронологии |
Era |
Эпоха календаря |
ChronoField |
Поля даты и времени |
IsoChronology является реализацией
Chronology.
ISO-8601 считается мировым стандартом хранения и передачи дат.
Причины использования:
Например:
2026-05-25
Интерпретируется одинаково:
IsoChronology реализован как singleton.
const { IsoChronology } = require('@js-joda/core')
const iso = IsoChronology.INSTANCE
console.log(iso)
Singleton означает:
console.log(IsoChronology.INSTANCE.id())
Результат:
ISO
console.log(IsoChronology.INSTANCE.calendarType())
Результат:
iso8601
Это значение соответствует международному стандарту Unicode CLDR.
date()const { IsoChronology } = require('@js-joda/core')
const date = IsoChronology.INSTANCE.date(2026, 8, 15)
console.log(date.toString())
Результат:
2026-08-15
ISO-хронология поддерживает эпохи:
prolepticYear()const { IsoChronology, IsoEra } = require('@js-joda/core')
const year = IsoChronology.INSTANCE.prolepticYear(
IsoEra.CE,
2026
)
console.log(year)
Результат:
2026
const { IsoChronology, IsoEra } = require('@js-joda/core')
const year = IsoChronology.INSTANCE.prolepticYear(
IsoEra.BCE,
1
)
console.log(year)
Результат:
0
В ISO-хронологии:
| Исторический год | ISO |
|---|---|
| 1 BCE | 0 |
| 2 BCE | -1 |
| 3 BCE | -2 |
Такое представление называется проолептическим исчислением.
isLeapYear()const { IsoChronology } = require('@js-joda/core')
console.log(
IsoChronology.INSTANCE.isLeapYear(2024)
)
Результат:
true
ISO использует григорианские правила:
Год високосный если:
или:
console.log(
IsoChronology.INSTANCE.isLeapYear(2000)
)
true
console.log(
IsoChronology.INSTANCE.isLeapYear(1900)
)
false
console.log(
IsoChronology.INSTANCE.isLeapYear(2023)
)
false
dateYearDay()const { IsoChronology } = require('@js-joda/core')
const date = IsoChronology.INSTANCE.dateYearDay(
2026,
120
)
console.log(date.toString())
Результат:
2026-04-30
Такой формат полезен:
dateEpochDay()epoch day — количество дней от
1970-01-01.
const { IsoChronology } = require('@js-joda/core')
const date = IsoChronology.INSTANCE.dateEpochDay(0)
console.log(date.toString())
Результат:
1970-01-01
const date = IsoChronology.INSTANCE.dateEpochDay(-1)
console.log(date.toString())
Результат:
1969-12-31
IsoChronology умеет преобразовывать объекты времени.
date()const {
IsoChronology,
LocalDateTime
} = require('@js-joda/core')
const dateTime = LocalDateTime.now()
const date = IsoChronology.INSTANCE.date(dateTime)
console.log(date.toString())
dateNow()const { IsoChronology } = require('@js-joda/core')
const today = IsoChronology.INSTANCE.dateNow()
console.log(today.toString())
const {
IsoChronology,
ZoneId
} = require('@js-joda/core')
const tokyoDate =
IsoChronology.INSTANCE.dateNow(
ZoneId.of('Asia/Tokyo')
)
console.log(tokyoDate.toString())
localDateTime()const {
IsoChronology,
Instant,
ZoneOffset
} = require('@js-joda/core')
const instant = Instant.now()
const dateTime =
IsoChronology.INSTANCE.localDateTime(
instant,
ZoneOffset.UTC
)
console.log(dateTime.toString())
zonedDateTime()const {
IsoChronology,
Instant,
ZoneId
} = require('@js-joda/core')
const zoned =
IsoChronology.INSTANCE.zonedDateTime(
Instant.now(),
ZoneId.of('Europe/Berlin')
)
console.log(zoned.toString())
IsoChronology активно взаимодействует с:
| Тип | Назначение |
|---|---|
Instant |
Точка времени UTC |
ZoneId |
Идентификатор зоны |
ZoneOffset |
Смещение UTC |
Clock |
Источник времени |
eraOf()const { IsoChronology } = require('@js-joda/core')
const era = IsoChronology.INSTANCE.eraOf(1)
console.log(era.toString())
Результат:
CE
| Значение | Эпоха |
|---|---|
| 0 | BCE |
| 1 | CE |
const eras = IsoChronology.INSTANCE.eras()
console.log(eras)
IsoChronology валидирует даты автоматически.
IsoChronology.INSTANCE.date(2025, 2, 30)
Результат:
DateTimeException
Проверяются:
ISO-хронология распространяет современные правила григорианского календаря на всё прошлое.
Это означает:
В реальной истории:
1582-10-041582-10-15В IsoChronology такого разрыва нет.
const date = IsoChronology.INSTANCE.date(
1582,
10,
10
)
console.log(date.toString())
Результат:
1582-10-10
const date = new Date()
Проблемы:
Преимущества:
LocalDate фактически использует
IsoChronology.
const { LocalDate } = require('@js-joda/core')
const date = LocalDate.now()
console.log(
date.chronology().id()
)
Результат:
ISO
const { LocalDate } = require('@js-joda/core')
const date = LocalDate.now()
console.log(
date.chronology() ===
IsoChronology.INSTANCE
)
Результат:
true
IsoChronology играет роль фундаментального календарного
движка библиотеки.
Через него реализуются:
| Метод | Назначение |
|---|---|
date() |
Создание даты |
dateNow() |
Текущая дата |
dateEpochDay() |
Дата из epoch day |
dateYearDay() |
Дата из day-of-year |
isLeapYear() |
Проверка високосного года |
prolepticYear() |
ISO-год |
eraOf() |
Получение эпохи |
eras() |
Список эпох |
localDateTime() |
Создание LocalDateTime |
zonedDateTime() |
Создание ZonedDateTime |
const {
IsoChronology
} = require('@js-joda/core')
const iso = IsoChronology.INSTANCE
const year = 2024
if (iso.isLeapYear(year)) {
console.log('366 days')
} else {
console.log('365 days')
}
ISO-хронология особенно важна в:
Причина — единое и строго стандартизированное поведение дат.
IsoChronology полностью ориентирован на ISO-8601:
| Формат | Пример |
|---|---|
| Дата | 2026-05-25 |
| Время | 14:30:00 |
| UTC | 2026-05-25T14:30:00Z |
| Offset | 2026-05-25T14:30:00+03:00 |
| Zoned | 2026-05-25T14:30:00+03:00[Europe/Moscow] |
Все объекты, создаваемые через IsoChronology,
неизменяемы.
const date1 =
IsoChronology.INSTANCE.date(2026, 1, 1)
const date2 = date1.plusDays(10)
console.log(date1.toString())
console.log(date2.toString())
Результат:
2026-01-01
2026-01-11
Исходный объект не изменяется.
Immutable-подход предотвращает:
IsoChronology оптимизирован для:
Singleton-архитектура уменьшает количество создаваемых объектов.
Практически вся библиотека строится вокруг ISO-модели времени:
| Класс | Использование ISO |
|---|---|
LocalDate |
Да |
LocalDateTime |
Да |
OffsetDateTime |
Да |
ZonedDateTime |
Да |
Instant |
Да |
Period |
Да |
Duration |
Частично |
YearMonth |
Да |
Прямое использование требуется редко, но полезно:
Chronology.В большинстве прикладных задач используется LocalDate и
связанные типы, которые уже основаны на IsoChronology.