Парсинг с указанием формата

В Day.js обработка строковых дат по заданному шаблону опирается на плагин customParseFormat, который расширяет базовые возможности библиотеки и позволяет интерпретировать входные строки строго в соответствии с указанной структурой. Без подключения этого плагина Day.js ограничивается поддержкой ISO-формата и некоторых встроенных сценариев разбора.

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

Для работы с форматированными строками требуется подключение плагина:

import dayjs from 'dayjs'
import customParseFormat from 'dayjs/plugin/customParseFormat'

dayjs.extend(customParseFormat)

После активации становится доступна сигнатура:

dayjs(string, format, strict)

где:

  • string — исходная строка даты;
  • format — шаблон, описывающий структуру строки;
  • strict — режим строгой проверки соответствия.

Базовые правила форматирования

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

Токен Значение
YYYY год (4 цифры)
YY год (2 цифры)
MM месяц (01–12)
DD день месяца
HH часы (24-часовой формат)
mm минуты
ss секунды

Пример интерпретации строки:

dayjs('2026-05-22', 'YYYY-MM-DD')

Каждый токен должен строго соответствовать части строки, иначе результатом станет некорректная дата.


Строгий и нестрогий режим парсинга

Третий параметр управляет поведением проверки соответствия формату.

Нестрогий режим

dayjs('2026-5-2', 'YYYY-MM-DD')

В этом случае библиотека может попытаться интерпретировать однозначные значения даже при нарушении формата. Это повышает гибкость, но снижает предсказуемость.


Строгий режим

dayjs('2026-5-2', 'YYYY-MM-DD', true)

При включённой строгой проверке:

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

Пример:

dayjs('2026-05-2', 'YYYY-MM-DD', true) // Invalid Date

Работа с пользовательскими форматами

Day.js позволяет описывать практически любые строковые структуры.

Пример даты с нестандартным разделителем

dayjs('22/05/2026', 'DD/MM/YYYY')

Пример даты с текстовыми элементами

dayjs('22 мая 2026 14:30', 'DD MMMM YYYY HH:mm')

Для корректного разбора таких строк требуется подключение локализации:

import 'dayjs/locale/ru'
dayjs.locale('ru')

Парсинг времени без даты

Форматирование может ограничиваться только временной частью:

dayjs('14:45:30', 'HH:mm:ss')

Такой вызов создаёт объект даты, привязанный к текущему дню, но с указанным временем.


Обработка двухзначных лет

Токен YY интерпретируется относительно текущего века:

dayjs('26-05-22', 'YY-MM-DD')

Значение года автоматически преобразуется в диапазон, определяемый внутренними правилами библиотеки.


Некорректные строки и результат парсинга

При несоответствии строки формату возвращается объект с состоянием недействительной даты.

const d = dayjs('invalid-date', 'YYYY-MM-DD')

d.isValid() // false

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

dayjs().isValid()

Множественные форматы

Day.js позволяет передавать массив форматов, которые будут проверяться последовательно:

dayjs('22-05-2026', ['YYYY/MM/DD', 'DD-MM-YYYY'])

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


Парсинг с учетом времени и даты одновременно

Комбинированные шаблоны позволяют разбирать полные временные метки:

dayjs('2026-05-22 18:30:45', 'YYYY-MM-DD HH:mm:ss')

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


Особенности интерпретации месяцев

Месяцы в Day.js нумеруются с учётом человеческого представления (1–12), однако внутри объекта даты используется нулевая индексация. При парсинге это скрыто от разработчика:

dayjs('2026-05-01', 'YYYY-MM-DD')

Результирующий объект корректно интерпретирует май как пятый месяц без дополнительной корректировки.


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

Помимо стандартных токенов, поддерживаются дополнительные элементы:

  • A / a — AM/PM;
  • Z — часовой пояс;
  • SSS — миллисекунды.

Пример:

dayjs('2026-05-22 02:15:10 PM', 'YYYY-MM-DD hh:mm:ss A')

Ограничения парсинга с форматом

Парсинг с указанием формата имеет ряд особенностей:

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

Комбинация с другими плагинами

Функциональность парсинга часто используется вместе с другими расширениями:

  • utc — работа с универсальным временем;
  • timezone — управление часовыми поясами;
  • customParseFormat — разбор строк.

Пример совместного использования:

import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)

dayjs.utc('2026-05-22 12:00', 'YYYY-MM-DD HH:mm')

Поведение при частичном совпадении формата

Если строка содержит дополнительные символы или пропущенные элементы, результат зависит от режима строгой проверки.

Нестрогий режим может игнорировать незначительные отклонения:

dayjs('2026-05-22T12:00', 'YYYY-MM-DD HH:mm')

Строгий режим требует полного соответствия шаблону, включая разделители и структуру.


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

При разборе строки Day.js:

  1. анализирует формат;
  2. строит карту токенов;
  3. последовательно извлекает значения;
  4. валидирует диапазоны (месяцы, дни, часы);
  5. формирует объект даты.

Любое нарушение диапазонов приводит к инвалидному состоянию:

dayjs('2026-13-40', 'YYYY-MM-DD', true).isValid() // false

Практическое значение форматного парсинга

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

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

Сложные составные форматы

Возможны комбинированные шаблоны с текстовыми вставками:

dayjs('Дата: 22-05-2026 | Время: 18:30', '[Дата:] DD-MM-YYYY [| Время:] HH:mm')

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


Результаты преобразования и цепочки вызовов

После парсинга объект Day.js остаётся неизменяемым, а любые операции создают новые экземпляры:

const date = dayjs('2026-05-22', 'YYYY-MM-DD')
const updated = date.add(1, 'day')

Парсинг формата является начальной точкой построения цепочек преобразований, влияя на всю последующую работу с датой.