Temporal API представляет собой современную альтернативу встроенному объекту Date, устраняющую множество исторических проблем работы с датой и временем в JavaScript. Ключевая идея заключается в разделении понятий: календарные даты, точное время, временные зоны и длительности представлены разными специализированными типами, а не одной перегруженной сущностью.
Объект Date в JavaScript исторически объединяет
несколько различных концепций времени:
Day.js частично решает эти проблемы через неизменяемость и удобный
API, но всё равно опирается на Date внутри.
Temporal вводит строгую модель данных:
Такое разделение устраняет неоднозначности и делает операции предсказуемыми.
Day.js строится вокруг нескольких ключевых принципов:
Внутри Day.js всё равно используется Date, но библиотека
скрывает сложность за единым интерфейсом.
Пример базовой работы:
import dayjs from 'dayjs';
const now = dayjs();
const future = now.add(2, 'day');
const formatted = future.format('YYYY-MM-DD HH:mm');
Несмотря на удобство, Day.js не решает фундаментальные проблемы временных зон и различия типов времени, которые и закрывает Temporal.
Day.js
DateTemporal
Day.js требует плагинов:
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs().tz('Asia/Tokyo');
Temporal делает это частью базовой модели через
ZonedDateTime.
dayjs().format('DD.MM.YYYY');
Форматирование полностью отделено от типа данных.
Temporal разделяет хранение и форматирование:
const date = new Temporal.PlainDate(2026, 5, 23);
new Intl.DateTimeFormat('ru-RU').format(date.toPlainDateTime(0));
Несмотря на различие моделей, в реальных приложениях часто требуется совместное использование.
Основной подход — переход через ISO-строку или timestamp:
const instant = Temporal.Now.instant();
const jsDate = new Date(instant.epochMilliseconds);
const d = dayjs(jsDate);
Либо через строку:
const d = dayjs(instant.toString());
Так как Day.js оборачивает Date, используется обратное
преобразование:
const d = dayjs();
const instant = Temporal.Instant.fromEpochMilliseconds(d.valueOf());
или через Date:
const instant = Temporal.Instant.from(d.toDate().toISOString());
Day.js часто используется в проектах, где:
Temporal в таких случаях может внедряться точечно:
Типичная архитектура:
Пример:
// бизнес-слой
const start = Temporal.Now.zonedDateTimeISO('Europe/Moscow');
const end = start.add({ hours: 3 });
// UI-слой
const formatted = dayjs(end.toString()).format('HH:mm');
import duration from 'dayjs/plugin/duration';
dayjs.extend(duration);
const d = dayjs.duration(2, 'hours');
Ограничения:
const dur = new Temporal.Duration(0, 0, 0, 0, 2);
Преимущества:
Добавление месяцев зависит от длины месяца:
dayjs('2024-01-31').add(1, 'month'); // 29 февраля или 2 марта
Поведение зависит от внутренних правил Date.
Temporal явно определяет результат:
const date = new Temporal.PlainDate(2024, 1, 31);
date.add({ months: 1 });
Результат вычисляется по календарной модели, а не по эвристике
Date.
Day.js:
Temporal:
ZonedDateTime включает:
const zdt = Temporal.Now.zonedDateTimeISO('Asia/Almaty');
Это устраняет необходимость в сторонних абстракциях.
JSON.stringify(dayjs().toISOString());
или
dayjs().valueOf();
const json = Temporal.Now.instant().toString();
или структурированное представление:
const obj = Temporal.Now.plainDateISO().toJSON();
Temporal обеспечивает более предсказуемую сериализацию без потери семантики.
Day.js часто остается в системе как слой совместимости:
Temporal:
Day.js:
При комбинировании библиотек возникают особенности:
Эти проблемы решаются строгими границами между слоями приложения.
Day.js сохраняет актуальность в сценариях:
Temporal ориентирован на:
Обе модели могут сосуществовать, но решают разные уровни задач: Day.js — представление, Temporal — семантика времени.