Диагностика проблем с парсингом

В библиотеке Day.js парсинг даты выполняется через ограниченный набор стратегий, ориентированных на предсказуемость и совместимость с ISO-8601. Любые отклонения от стандартных форматов приводят к неоднозначным результатам, которые внешне выглядят как «неправильная дата», Invalid Date или смещённое время.

Ключевая особенность заключается в том, что Day.js не пытается «угадывать» формат строки. Если входные данные не соответствуют ожидаемому шаблону, результат либо становится невалидным, либо интерпретируется в локальном контексте с системным часовым поясом.


Базовые сценарии парсинга и их ограничения

ISO-строки как основной безопасный формат

Наиболее надёжный формат — ISO 8601:

dayjs("2026-05-23T10:15:30Z")
dayjs("2026-05-23")

При использовании ISO-строк поведение считается детерминированным:

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

Нестрогий парсинг строк

При передаче произвольной строки:

dayjs("23/05/2026")

результат зависит от внутреннего разбора JavaScript Date, который Day.js использует как fallback. Такое поведение приводит к следующим проблемам:

  • различия между браузерами и Node.js;
  • интерпретация формата как MM/DD/YYYY или DD/MM/YYYY;
  • возможное создание Invalid Date.

Определение некорректного результата

Метод проверки валидности

Основной инструмент диагностики:

const d = dayjs("invalid-date");
d.isValid(); // false

isValid() опирается на внутренний флаг парсинга и не всегда отражает семантическую корректность бизнес-логики, только техническую возможность разбора.


Признаки ошибок парсинга

Типовые индикаторы:

  • dayjs(...).format() возвращает строку "Invalid Date";
  • isValid() возвращает false;
  • при операциях добавления/вычитания результат становится NaN-подобным;
  • смещение даты относительно ожидаемой.

Подключение расширенного парсинга форматов

Плагин customParseFormat

Основной механизм работы с нестандартными строками — customParseFormat.

import dayjs from "dayjs";
import customParseFormat from "dayjs/plugin/customParseFormat";

dayjs.extend(customParseFormat);

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


Строгий разбор строк

dayjs("23/05/2026", "DD/MM/YYYY", true)

Третий параметр включает строгий режим:

  • несовпадение формата приводит к Invalid Date;
  • предотвращается неоднозначный парсинг.

Диагностика ошибок формата

Частая проблема — несоответствие шаблона и строки:

dayjs("2026-05-23", "DD/MM/YYYY", true) // invalid

Диагностический подход:

  • проверка входной строки;
  • сравнение с маской;
  • временное отключение strict mode для анализа поведения.

Проблемы локали и региональных форматов

Влияние локали на парсинг

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

import "dayjs/locale/ru";
dayjs.locale("ru");

Локаль влияет на:

  • форматирование;
  • названия месяцев;
  • вывод.

Не влияет на:

  • разбор входных строк без плагинов.

Частая ошибка: ожидание автоматического понимания формата

Строки вида:

23 мая 2026

не интерпретируются без дополнительной логики. Это приводит к ошибочному предположению о «сломавшемся парсере», хотя фактически отсутствует поддержка формата.


Диагностика через логирование промежуточных значений

Проверка входного значения

Перед парсингом фиксируется исходная строка:

console.log(inputDateString);

Типичные проблемы:

  • скрытые пробелы;
  • неразрывные пробелы;
  • неожиданные символы Unicode.

Нормализация строки

Диагностический этап включает очистку:

const normalized = input.trim().replace(/\u00A0/g, " ");

Проверка результата парсинга

const parsed = dayjs(normalized, "DD/MM/YYYY", true);

console.log(parsed.isValid());
console.log(parsed.toString());

Работа с UTC и временными смещениями

Подключение UTC-плагина

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

Диагностика смещений времени

Типовая проблема — сдвиг на несколько часов:

dayjs("2026-05-23T00:00:00Z").format()

Причина:

  • локальное отображение времени;
  • отсутствие явного UTC-контекста.

Различие между локальным и UTC-разбором

dayjs.utc("2026-05-23T00:00:00Z")
dayjs("2026-05-23T00:00:00Z")

Разница проявляется в:

  • часовом сдвиге;
  • сравнении дат;
  • сериализации.

Типичные ошибки форматов

Перепутанные компоненты даты

dayjs("2026-23-05") // неверно интерпретируется

Ошибка возникает из-за:

  • отсутствия строгого формата;
  • fallback на Date.parse.

Неполные даты

dayjs("2026-05")

Поведение:

  • интерпретация как первый день месяца или Invalid Date в строгом режиме;
  • зависимость от окружения.

Временные значения без даты

dayjs("10:30:00")

Результат:

  • привязка к текущей дате;
  • трудности при сравнении.

Отладка через преобразования форматов

Преобразование в ISO как метод диагностики

const d = dayjs("23/05/2026", "DD/MM/YYYY", true);
d.toISOString();

Если результат Invalid Date, проблема локализуется на этапе парсинга.


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

console.log(input);
console.log(d.format("YYYY-MM-DD"));

Расхождение указывает на:

  • неверный шаблон;
  • неправильный порядок компонентов;
  • отсутствие плагина.

Использование isValid как фильтра данных

Фильтрация входных данных

const dates = ["2026-05-23", "invalid", "23/05/2026"];

const valid = dates
  .map(d => dayjs(d, "YYYY-MM-DD", true))
  .filter(d => d.isValid());

Ограничения подхода

isValid() не выявляет:

  • логические ошибки (например, будущие/прошедшие границы);
  • неверную интерпретацию формата при нестрогом режиме.

Проблемы цепочек преобразований

Потеря точности при повторном парсинге

const d1 = dayjs("2026-05-23");
const d2 = dayjs(d1.format("DD/MM/YYYY"), "DD/MM/YYYY", true);

Риски:

  • деградация формата;
  • потеря временной зоны;
  • накопление ошибок интерпретации.

Рекомендация для диагностики цепочек

Фиксация промежуточных значений:

console.log(d1.toISOString());
console.log(d1.format());

Инструменты изоляции проблемы

Минимизация входных данных

Последовательное упрощение строки:

  • удаление времени;
  • удаление зоны;
  • упрощение формата до даты.

Проверка в чистом окружении

Типичный диагностический подход:

  • отключение локали;
  • исключение плагинов;
  • тестирование только ISO.

Итоговые диагностические паттерны поведения

Поведение Day.js при проблемах парсинга почти всегда укладывается в три категории:

  • строгий режим → немедленная ошибка;
  • нестрогий режим → скрытая интерпретация;
  • fallback на native Date → неконтролируемый результат.

Комбинация этих факторов формирует большинство ошибок при работе с входными датами, особенно при обработке пользовательских строк и внешних API.