Day.js — компактная библиотека для работы с датами и временем в JavaScript, созданная как минималистичная альтернатива более тяжёлым решениям. Основная идея заключается в предоставлении привычного API для обработки дат при крайне малом размере пакета и высокой скорости работы. Библиотека повторяет концепции Moment.js, но устраняет его ключевые недостатки: большой вес, изменяемость объектов и избыточную функциональность, которая часто не используется в реальных проектах.
Day.js построена вокруг принципа immutable-объектов. Любая операция с датой не изменяет исходный объект, а возвращает новый экземпляр. Это снижает количество побочных эффектов и делает код более предсказуемым.
Основные принципы:
Библиотека ориентирована на использование в клиентских приложениях, где критичны размер бандла и скорость загрузки, а также в серверных приложениях, где важна предсказуемость работы с временем.
В стандартном JavaScript уже существует объект Date,
однако его использование связано с рядом ограничений:
На фоне этих ограничений появились библиотеки уровня 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);
Поддерживаются:
Date;Получение компонентов даты:
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');
Поддерживаемые единицы:
Каждый вызов возвращает новый объект, что позволяет строить цепочки:
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();
Примеры результата:
Также доступно направление:
dayjs().to(dayjs('2024-06-01'));
Одним из ключевых архитектурных решений является модульная система плагинов. Ядро Day.js содержит только базовую функциональность, а дополнительные возможности подключаются отдельно.
Примеры популярных плагинов:
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
dayjs.utc();
Позволяет работать с UTC-временем без смещения локальной зоны.
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(timezone);
dayjs().tz('Europe/London');
Используется для работы с часовыми поясами.
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 является минимальный размер ядра. В базовой конфигурации библиотека занимает всего несколько килобайт, что делает её особенно привлекательной для:
Благодаря отсутствию лишней логики и ленивому подключению модулей через плагины достигается высокая производительность даже при интенсивной работе с датами.
В экосистеме JavaScript существует несколько стратегий:
Date — минимальный функционал, высокая
сложность использования;Day.js делает ставку на предсказуемость поведения, цепочечный API и модульность, что позволяет использовать его как в небольших проектах, так и в крупных системах без значительного влияния на размер бандла.