Переход с Day.js на js-joda связан не только со сменой библиотеки, но и с изменением подхода к работе с датой и временем.
Day.js — лёгкая библиотека, ориентированная на совместимость с Moment.js и цепочечный API. js-joda — порт Java Time API (java.time), основанный на строгой модели календарных сущностей и иммутабельности.
Ключевое отличие заключается в философии:
В Day.js используется единый объект-обёртка:
dayjs() возвращает объект-обёртку над
Datejs-joda разделяет концепции:
LocalDate — дата без времениLocalTime — время без датыLocalDateTime — дата и время без зоныZonedDateTime — дата и время с временной зонойInstant — точка времени в UTCКлючевой принцип: каждая сущность строго определена и не смешивает ответственность.
Обе библиотеки иммутабельны, но в js-joda это фундаментальная гарантия:
В Day.js иммутабельность также соблюдается, но:
В js-joda иммутабельность встроена в модель языка библиотеки.
import dayjs from 'dayjs';
const date = dayjs();
const parsed = dayjs('2026-01-01');
const modified = date.add(5, 'day');
import { LocalDate } from '@js-joda/core';
const date = LocalDate.now();
const parsed = LocalDate.parse('2026-01-01');
const modified = date.plusDays(5);
add(value, unit)subtract(value, unit)dayjs().add(2, 'month');
dayjs().subtract(10, 'day');
date.plusMonths(2);
date.minusDays(10);
Ключевое отличие: отсутствие строковых единиц измерения в js-joda.
Гибкий парсинг:
dayjs('2026-01-01');
dayjs('01/01/2026', 'DD/MM/YYYY');
Форматирование:
dayjs().format('YYYY-MM-DD');
Парсинг строго ISO-форматированный:
LocalDate.parse('2026-01-01');
Форматирование требует отдельного форматтера:
import { DateTimeFormatter } from '@js-joda/core';
const formatter = DateTimeFormatter.ofPattern('dd.MM.yyyy');
date.format(formatter);
Ключевое отличие: отсутствие неявного парсинга и глобальных форматов.
Поддержка через плагины:
utctimezoneimport utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
Отдельный модуль:
import { ZonedDateTime, ZoneId } from '@js-joda/core';
const zdt = ZonedDateTime.now(ZoneId.of('Europe/Berlin'));
Особенности:
| Операция | Day.js | js-joda |
|---|---|---|
| текущая дата | dayjs() |
LocalDate.now() |
| парсинг | dayjs(str) |
LocalDate.parse(str) |
| прибавить дни | .add(1, 'day') |
.plusDays(1) |
| форматирование | .format() |
formatter.format() |
| UTC | plugin | Instant |
Day.js частично опирается на Date:
js-joda:
Date в логикеDay.js:
js-joda:
Это устраняет ошибки вида:
Типичные места:
Рекомендуемая последовательность:
Day.js → js-joda:
dayjs() → LocalDateTime.now() или
Instant.now()add('day') → plusDays()format() → DateTimeFormatterLocalDate.parse('01/01/2026'); // ошибка
js-joda требует ISO или форматтера.
Day.js:
dayjs().tz('Asia/Almaty')
js-joda:
ZonedDateTime.now(ZoneId.of('Asia/Almaty'))
date.plus('day') // не существует
В js-joda только строго типизированные методы.
js-joda предоставляет более строгие инструменты:
Day.js в большей степени опирается на JavaScript Date и плагины.
js-joda:
Day.js:
Day.js ориентирован на:
js-joda ориентирован на:
const result = dayjs()
.add(7, 'day')
.format('YYYY-MM-DD');
import { LocalDate, DateTimeFormatter } from '@js-joda/core';
const formatter = DateTimeFormatter.ofPattern('yyyy-MM-dd');
const result = LocalDate.now()
.plusDays(7)
.format(formatter);