В библиотеке Day.js парсинг даты выполняется через ограниченный набор
стратегий, ориентированных на предсказуемость и совместимость с
ISO-8601. Любые отклонения от стандартных форматов приводят к
неоднозначным результатам, которые внешне выглядят как «неправильная
дата», Invalid Date или смещённое время.
Ключевая особенность заключается в том, что Day.js не пытается «угадывать» формат строки. Если входные данные не соответствуют ожидаемому шаблону, результат либо становится невалидным, либо интерпретируется в локальном контексте с системным часовым поясом.
Наиболее надёжный формат — ISO 8601:
dayjs("2026-05-23T10:15:30Z")
dayjs("2026-05-23")
При использовании ISO-строк поведение считается детерминированным:
При передаче произвольной строки:
dayjs("23/05/2026")
результат зависит от внутреннего разбора JavaScript
Date, который Day.js использует как fallback. Такое
поведение приводит к следующим проблемам:
Invalid Date.Основной инструмент диагностики:
const d = dayjs("invalid-date");
d.isValid(); // false
isValid() опирается на внутренний флаг парсинга и не
всегда отражает семантическую корректность бизнес-логики, только
техническую возможность разбора.
Типовые индикаторы:
dayjs(...).format() возвращает строку
"Invalid Date";isValid() возвращает false;NaN-подобным;Основной механизм работы с нестандартными строками —
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
Диагностический подход:
Day.js поддерживает локализацию, но не использует её для автоматического распознавания входных строк.
import "dayjs/locale/ru";
dayjs.locale("ru");
Локаль влияет на:
Не влияет на:
Строки вида:
23 мая 2026
не интерпретируются без дополнительной логики. Это приводит к ошибочному предположению о «сломавшемся парсере», хотя фактически отсутствует поддержка формата.
Перед парсингом фиксируется исходная строка:
console.log(inputDateString);
Типичные проблемы:
Диагностический этап включает очистку:
const normalized = input.trim().replace(/\u00A0/g, " ");
const parsed = dayjs(normalized, "DD/MM/YYYY", true);
console.log(parsed.isValid());
console.log(parsed.toString());
import utc from "dayjs/plugin/utc";
dayjs.extend(utc);
Типовая проблема — сдвиг на несколько часов:
dayjs("2026-05-23T00:00:00Z").format()
Причина:
dayjs.utc("2026-05-23T00:00:00Z")
dayjs("2026-05-23T00:00:00Z")
Разница проявляется в:
dayjs("2026-23-05") // неверно интерпретируется
Ошибка возникает из-за:
dayjs("2026-05")
Поведение:
Invalid Date в
строгом режиме;dayjs("10:30:00")
Результат:
const d = dayjs("23/05/2026", "DD/MM/YYYY", true);
d.toISOString();
Если результат Invalid Date, проблема локализуется на
этапе парсинга.
console.log(input);
console.log(d.format("YYYY-MM-DD"));
Расхождение указывает на:
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());
Последовательное упрощение строки:
Типичный диагностический подход:
Поведение Day.js при проблемах парсинга почти всегда укладывается в три категории:
Комбинация этих факторов формирует большинство ошибок при работе с входными датами, особенно при обработке пользовательских строк и внешних API.