Библиотека js-joda реализует подход к работе со временем, основанный на Java Time (java.time). Ключевая особенность — полная иммутабельность объектов: каждая операция над датой или временем возвращает новый экземпляр, не изменяя исходный.
Такой подход устраняет целый класс ошибок, характерных для
стандартного Date в JavaScript, где изменения объекта могут
приводить к непредсказуемым побочным эффектам.
Иммутабельность означает:
В js-joda используется набор специализированных классов, каждый из которых отвечает за строго определённую задачу.
LocalDate представляет календарную дату без времени и
часового пояса.
Используется для:
Пример:
import { LocalDate } from '@js-joda/core';
const date = LocalDate.of(2026, 5, 23);
const nextDay = date.plusDays(1);
Операция plusDays не изменяет исходный объект, а создаёт
новый.
LocalTime описывает время без даты и без часового
пояса.
Используется для:
import { LocalTime } from '@js-joda/core';
const time = LocalTime.of(14, 30);
const later = time.plusHours(2);
LocalDateTime объединяет дату и время, но не содержит
информации о часовом поясе.
Подходит для:
import { LocalDateTime } from '@js-joda/core';
const dt = LocalDateTime.of(2026, 5, 23, 10, 15);
const updated = dt.plusMinutes(45);
Instant представляет точку на временной шкале в формате
UTC.
Используется для:
import { Instant } from '@js-joda/core';
const now = Instant.now();
const later = now.plusSeconds(60);
ZonedDateTime объединяет дату, время и часовой пояс.
Это наиболее полный тип для реальных пользовательских сценариев.
import { ZonedDateTime, ZoneId } from '@js-joda/core';
const zdt = ZonedDateTime.now(ZoneId.of('Europe/Paris'));
const converted = zdt.withZoneSameInstant(ZoneId.of('UTC'));
Особенность: изменение зоны не меняет момент времени, а пересчитывает отображение.
Duration измеряет точное время в секундах и
наносекундах.
Используется для:
Instantimport { Duration, Instant } from '@js-joda/core';
const start = Instant.now();
const end = start.plusSeconds(90);
const duration = Duration.between(start, end);
Period работает с календарными единицами: годами,
месяцами, днями.
Используется для:
import { Period } from '@js-joda/core';
const period = Period.of(1, 2, 10); // 1 год, 2 месяца, 10 дней
Все типы поддерживают единый набор методов:
plusDays, plusMonths,
plusYearsminusDays, minusHourswithDayOfMonth, withYearПринцип работы:
const result = LocalDate
.of(2026, 1, 1)
.plusMonths(1)
.minusDays(2)
.withDayOfMonth(10);
Для сравнения используются методы:
isBeforeisAfterisEqualconst a = LocalDate.of(2026, 5, 1);
const b = LocalDate.of(2026, 5, 23);
const check = a.isBefore(b);
Сравнение строго типизировано: нельзя случайно сравнить
LocalDate и LocalTime.
js-joda использует отдельный механизм форматирования через
DateTimeFormatter.
import { DateTimeFormatter } from '@js-joda/core';
const formatter = DateTimeFormatter.ofPattern('dd.MM.yyyy');
const text = LocalDate.of(2026, 5, 23).format(formatter);
const parsed = LocalDate.parse('23.05.2026', formatter);
Преимущество подхода:
Часовые пояса в js-joda представлены через ZoneId.
Особенности:
import { ZoneId } from '@js-joda/core';
const zone = ZoneId.of('Asia/Almaty');
Типичная цепочка преобразований:
Instant → ZonedDateTime (через зону)ZonedDateTime → LocalDateTime (с потерей
зоны)LocalDateTime → Instant (через указание
зоны)const instant = Instant.now();
const zoned = instant.atZone(ZoneId.of('UTC'));
const local = zoned.toLocalDateTime();
В библиотеке Day.js используется другой философский подход:
js-joda, напротив:
Стандартный Date в JavaScript имеет ряд ограничений:
js-joda решает это через:
Использование Period и Duration позволяет
разделять:
Пример бизнес-логики подписки:
const start = LocalDate.now();
const end = start.plusMonths(1);
const isActive = LocalDate.now().isBefore(end);
Такой подход снижает риск ошибок, связанных с разной длиной месяцев и переходами времени.
Архитектурно js-joda опирается на несколько принципов:
Эта модель хорошо подходит для:
Особое внимание уделяется:
Пример:
const zdt = LocalDateTime.of(2026, 3, 29, 2, 30)
.atZone(ZoneId.of('Europe/Berlin'));
Такие случаи требуют явного разрешения через правила зоны, что исключает неоднозначность.
js-joda особенно эффективна в системах, где требуется:
Иммутабельная модель позволяет безопасно: