Что такое Day.js

Day.js — компактная библиотека для работы с датами и временем в JavaScript, созданная как минималистичная альтернатива более тяжёлым решениям. Основная идея заключается в предоставлении привычного API для обработки дат при крайне малом размере пакета и высокой скорости работы. Библиотека повторяет концепции Moment.js, но устраняет его ключевые недостатки: большой вес, изменяемость объектов и избыточную функциональность, которая часто не используется в реальных проектах.

Day.js построена вокруг принципа immutable-объектов. Любая операция с датой не изменяет исходный объект, а возвращает новый экземпляр. Это снижает количество побочных эффектов и делает код более предсказуемым.

Основные принципы:

  • неизменяемость объектов даты;
  • цепочечный API (method chaining);
  • минимальный размер ядра;
  • расширяемость через плагины;
  • совместимость по синтаксису с Moment.js на уровне базовых методов.

Библиотека ориентирована на использование в клиентских приложениях, где критичны размер бандла и скорость загрузки, а также в серверных приложениях, где важна предсказуемость работы с временем.

Причины появления Day.js и место среди решений

В стандартном JavaScript уже существует объект Date, однако его использование связано с рядом ограничений:

  • неудобный API для форматирования;
  • сложная работа с часовыми поясами;
  • отсутствие встроенных методов для относительного времени;
  • нестабильность при парсинге строк;
  • ограниченные возможности манипуляции датами.

На фоне этих ограничений появились библиотеки уровня Moment.js, которые решали большинство проблем, но имели собственные недостатки:

  • большой размер (десятки килобайт);
  • мутируемое состояние объектов;
  • устаревшая архитектура.

Day.js занимает промежуточную позицию: предоставляет богатый API, но остаётся крайне лёгкой библиотекой (около 2–3 KB в сжатом виде).

Установка и подключение

Day.js устанавливается как обычный npm-пакет:

npm install dayjs

Использование в коде:

import dayjs from 'dayjs';

const now = dayjs();

В CommonJS-среде:

const dayjs = require('dayjs');

После подключения создаётся функция dayjs(), возвращающая объект-обёртку над датой.

Базовая работа с датами

Создание экземпляра:

dayjs();
dayjs('2024-01-01');
dayjs(new Date());
dayjs(1710000000000);

Поддерживаются:

  • строки в ISO-формате;
  • объекты Date;
  • UNIX timestamp (миллисекунды).

Получение компонентов даты:

const date = dayjs('2024-05-10T12:30:00');

date.year();   // 2024
date.month();  // 4 (месяцы начинаются с 0)
date.date();   // 10
date.hour();   // 12
date.minute(); // 30

Форматирование дат

Одной из ключевых возможностей является преобразование даты в строку:

dayjs().format('YYYY-MM-DD');
dayjs().format('DD.MM.YYYY');
dayjs().format('YYYY-MM-DD HH:mm:ss');

Основные токены форматирования:

  • YYYY — полный год;
  • MM — месяц;
  • DD — день;
  • HH — часы (24-часовой формат);
  • mm — минуты;
  • ss — секунды.

Пример формирования читаемого вывода:

const formatted = dayjs('2024-06-01').format('D MMMM YYYY');

Форматирование является одной из причин популярности библиотеки, так как API интуитивно понятен и повторяет подход Moment.js.

Манипуляции с датами

Day.js предоставляет методы для изменения дат без мутации исходного объекта.

Прибавление времени

dayjs().add(7, 'day');
dayjs().add(2, 'month');
dayjs().add(1, 'year');

Вычитание времени

dayjs().subtract(10, 'minute');
dayjs().subtract(3, 'day');

Поддерживаемые единицы:

  • millisecond
  • second
  • minute
  • hour
  • day
  • week
  • month
  • year

Каждый вызов возвращает новый объект, что позволяет строить цепочки:

dayjs()
  .add(1, 'day')
  .subtract(2, 'hour')
  .format('YYYY-MM-DD HH:mm');

Сравнение дат

Для логики сравнения используются методы:

dayjs('2024-01-01').isBefore('2024-02-01');
dayjs('2024-03-01').isAfter('2024-02-01');
dayjs('2024-05-01').isSame('2024-05-01');

Можно уточнять единицы измерения:

dayjs('2024-05-10').isSame('2024-05-20', 'month');

Сравнение происходит на основе нормализованных значений, что исключает ошибки, характерные для работы с Date.

Работа с относительным временем

Функциональность относительного времени реализуется через плагин relativeTime.

import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);

Использование:

dayjs().fromNow();
dayjs('2024-01-01').fromNow();

Примеры результата:

  • “a few seconds ago”
  • “in 5 days”

Также доступно направление:

dayjs().to(dayjs('2024-06-01'));

Плагины и расширяемость

Одним из ключевых архитектурных решений является модульная система плагинов. Ядро Day.js содержит только базовую функциональность, а дополнительные возможности подключаются отдельно.

Примеры популярных плагинов:

UTC

import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);

dayjs.utc();

Позволяет работать с UTC-временем без смещения локальной зоны.

Timezone

import timezone from 'dayjs/plugin/timezone';
dayjs.extend(timezone);

dayjs().tz('Europe/London');

Используется для работы с часовыми поясами.

Advanced formatting

import advancedFormat from 'dayjs/plugin/advancedFormat';
dayjs.extend(advancedFormat);

Расширяет возможности форматирования дат.

Плагинная система позволяет сохранять минимальный размер ядра и подключать только необходимую функциональность.

Парсинг и валидация дат

Day.js автоматически пытается распознать входные данные, но предоставляет методы проверки корректности:

const d = dayjs('invalid-date');

d.isValid(); // false

Корректные данные:

dayjs('2024-01-01').isValid(); // true

Парсинг основан на строгих правилах ISO-формата, что снижает количество ошибок при работе с датами из внешних источников.

Клонирование и неизменяемость

Каждый объект Day.js является неизменяемым. Это означает, что любые операции возвращают новый экземпляр:

const a = dayjs();
const b = a.add(1, 'day');

a.format('YYYY-MM-DD') !== b.format('YYYY-MM-DD');

Клонирование:

const copy = dayjs(a);

Такой подход устраняет классические проблемы, связанные с неожиданным изменением даты в разных частях приложения.

Системы локализации

Day.js поддерживает локализацию через подключение языковых пакетов:

import 'dayjs/locale/ru';

dayjs.locale('ru');

После этого форматирование и относительное время адаптируются под выбранный язык:

dayjs().format('D MMMM YYYY');

Локализация влияет на названия месяцев, дней недели и текстовые выражения времени.

Производительность и размер

Ключевым преимуществом Day.js является минимальный размер ядра. В базовой конфигурации библиотека занимает всего несколько килобайт, что делает её особенно привлекательной для:

  • SPA-приложений;
  • мобильных веб-приложений;
  • серверных функций;
  • микрофронтендов.

Благодаря отсутствию лишней логики и ленивому подключению модулей через плагины достигается высокая производительность даже при интенсивной работе с датами.

Сравнение подходов к работе с датами

В экосистеме JavaScript существует несколько стратегий:

  • нативный Date — минимальный функционал, высокая сложность использования;
  • Moment.js — богатый API, но устаревшая архитектура и большой размер;
  • Day.js — баланс между функциональностью и лёгкостью.

Day.js делает ставку на предсказуемость поведения, цепочечный API и модульность, что позволяет использовать его как в небольших проектах, так и в крупных системах без значительного влияния на размер бандла.