Типичные ошибки и их решения

Одной из наиболее частых причин некорректного поведения становится ожидание «умного» парсинга произвольных строк. 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) исключает неоднозначность и повышает предсказуемость обработки дат.


Ошибки при работе с UTC и локальным временем

По умолчанию 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');

Важно: месяцы имеют переменную длину, что влияет на итоговую дату.


Ошибки импорта и tree-shaking

В современных сборках часто используется 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();

Каждое преобразование изменяет интерпретацию времени, что может привести к сдвигам при финальном выводе.

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