Одной из наиболее частых причин некорректного поведения становится ожидание «умного» парсинга произвольных строк. Day.js корректно и стабильно обрабатывает только строго определённые форматы.
Ключевой момент: строка даты без явного формата может быть интерпретирована непредсказуемо в зависимости от среды выполнения.
Пример проблемного кода:
import dayjs from 'dayjs';
const date = dayjs('12/11/2024');
Формат MM/DD/YYYY и DD/MM/YYYY не
различаются библиотекой автоматически. Это приводит к ошибкам
интерпретации.
Корректный подход:
import dayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);
const date = dayjs('12/11/2024', 'DD/MM/YYYY', true);
Строгий режим парсинга (true) исключает
неоднозначность и повышает предсказуемость обработки дат.
По умолчанию Day.js использует локальное время окружения. При работе с серверными данными часто возникает рассинхронизация часовых поясов.
Типичная ошибка:
import dayjs from 'dayjs';
const date = dayjs('2024-01-01T00:00:00Z');
console.log(date.format());
Результат может отличаться в зависимости от локальной временной зоны системы.
Для корректной работы с UTC требуется подключение плагина:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
const date = dayjs.utc('2024-01-01T00:00:00Z');
Важный момент: методы utc() и локальные
значения не являются взаимозаменяемыми. Смешивание приводит к сдвигам
времени при форматировании и вычислениях.
Day.js имеет модульную архитектуру. Без явного подключения функциональность считается отсутствующей.
Частая ошибка:
import dayjs from 'dayjs';
dayjs.tz('2024-01-01'); // ошибка: tz не существует
Необходимо подключение плагина:
import dayjs from 'dayjs';
import timezone from 'dayjs/plugin/timezone';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
dayjs.extend(timezone);
const date = dayjs.tz('2024-01-01', 'Europe/Moscow');
Критический момент: порядок подключения имеет
значение. Плагин utc должен быть подключён до
timezone.
Объекты Day.js являются неизменяемыми. Методы не модифицируют исходный объект, а возвращают новый.
Типичная ошибка:
import dayjs from 'dayjs';
const date = dayjs('2024-01-01');
date.add(1, 'day');
console.log(date.format()); // исходная дата не изменилась
Корректный подход:
const date = dayjs('2024-01-01');
const newDate = date.add(1, 'day');
Следствие: цепочки вызовов безопасны, но требуют явного сохранения результата.
Сравнение объектов Day.js через операторы > или
< приводит к некорректным результатам, поскольку
сравниваются ссылки, а не значения.
Неправильно:
if (dayjs('2024-01-01') > dayjs('2023-01-01')) {
// логика
}
Корректно:
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
dayjs.extend(isSameOrAfter);
const a = dayjs('2024-01-01');
const b = dayjs('2023-01-01');
if (a.isAfter(b)) {
// логика
}
Также допустимо сравнение через числовое представление:
if (a.valueOf() > b.valueOf()) {
// логика
}
Day.js использует собственные токены форматирования, которые отличаются от Moment.js и стандартных представлений.
Проблемный случай:
dayjs().format('YYYY-mm-DD');
Здесь mm обозначает минуты, а не месяцы.
Корректный вариант:
dayjs().format('YYYY-MM-DD');
Ключевая особенность:
MM — месяцmm — минутыDD — день месяцаОшибки в регистрах токенов являются источником трудноуловимых дефектов.
isValidМетод isValid() часто игнорируется, что приводит к
дальнейшим ошибкам в цепочках вычислений.
Проблема:
const date = dayjs('invalid-date');
console.log(date.format('YYYY-MM-DD'));
Результат — некорректное значение без явной ошибки выполнения.
Корректная проверка:
const date = dayjs('invalid-date');
if (!date.isValid()) {
// обработка ошибки
}
Несмотря на поддержку цепочек, логика выполнения может быть нарушена при неправильном ожидании промежуточного состояния.
Проблемный пример:
const result = dayjs('2024-01-01')
.add(1, 'day')
.subtract(1, 'month');
console.log(result.format());
Ошибка возникает, когда предполагается изменение исходного объекта после каждого шага. Day.js создаёт новый экземпляр на каждом вызове.
Без подключения локализации форматирование остаётся ограниченным базовыми настройками.
Ошибка:
dayjs().format('LL');
Без загрузки нужной локали результат будет стандартным или некорректным для ожидаемого языка.
Решение:
import dayjs from 'dayjs';
import 'dayjs/locale/ru';
dayjs.locale('ru');
dayjs().format('LL');
При добавлении или вычитании времени часто возникает неправильное понимание единиц измерения.
Проблемный пример:
dayjs().add(30, 'day');
При ожидании календарного месяца результат будет некорректным.
Для работы с месяцами:
dayjs().add(1, 'month');
Важно: месяцы имеют переменную длину, что влияет на итоговую дату.
В современных сборках часто используется ESM. Неправильный импорт приводит к увеличению бандла или потере функциональности.
Нежелательный вариант:
import * as dayjs from 'dayjs';
Корректный:
import dayjs from 'dayjs';
Дополнительные плагины должны подключаться отдельно, иначе они исключаются при tree-shaking.
При работе с плагинами вроде relativeTime часто
забывается их инициализация.
Ошибка:
dayjs().fromNow();
Корректная настройка:
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);
dayjs().fromNow();
Без подключения метод отсутствует или не работает.
При многократных преобразованиях дат возможно накопление логических ошибок из-за смешивания UTC и локального времени.
Проблемный сценарий:
const a = dayjs.utc('2024-01-01');
const b = a.local();
const c = b.utc();
Каждое преобразование изменяет интерпретацию времени, что может привести к сдвигам при финальном выводе.
Правильная стратегия заключается в выборе одной модели времени на всём протяжении вычислений.