Парсинг строк и форматов

В Day.js создание даты из строки выполняется через функцию dayjs(), которая принимает строковое представление времени и преобразует его в объект даты. По умолчанию библиотека опирается на ISO 8601 и поведение встроенного Date, но с важными отличиями в предсказуемости и стабильности результата.

Наиболее надёжным форматом считается ISO-строка:

import dayjs from 'dayjs';

const d1 = dayjs('2026-05-22T14:30:00');

Строки в формате ISO обрабатываются одинаково во всех окружениях, что устраняет различия между браузерами и Node.js.

При передаче строки, не соответствующей ISO, поведение зависит от среды выполнения:

const d2 = dayjs('2026/05/22 14:30');

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


Встроенный разбор форматов

Day.js поддерживает базовый разбор строк без дополнительных плагинов, однако он ограничен и не предназначен для сложных пользовательских форматов. При необходимости строгого контроля используется плагин customParseFormat.

Без плагина возможен только прямой ISO-подобный разбор:

dayjs('2026-05-22');
dayjs('2026-05-22T14:30:00Z');

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


Плагин customParseFormat

Для разбора строк по произвольным шаблонам используется customParseFormat. Он позволяет задавать формат входной строки явно и исключает неоднозначность интерпретации.

Подключение:

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

dayjs.extend(customParseFormat);

Пример разбора:

const d = dayjs('22-05-2026 14:30', 'DD-MM-YYYY HH:mm');

Формат строки задаётся вторым аргументом, что обеспечивает строгую привязку каждого элемента строки к соответствующему токену.


Строгий и нестрогий разбор

customParseFormat поддерживает строгий режим, при котором строка должна полностью соответствовать шаблону.

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

Третий аргумент true включает строгую проверку.

Различие поведения:

  • нестрогий режим допускает частичное совпадение
  • строгий режим требует полного соответствия формату

Пример отклонения в строгом режиме:

dayjs('22-05-2026 extra', 'DD-MM-YYYY', true); // invalid

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

Возможна передача массива форматов. Разбор выполняется последовательно до первого совпадения.

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

Такая стратегия используется при работе с разнородными источниками данных.


Токены формата

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

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

Пример композиции:

dayjs('2026-05-22 09:15:30', 'YYYY-MM-DD HH:mm:ss');

Точность разбора зависит от количества указанных токенов. Отсутствующие части заполняются значениями по умолчанию.


Разбор дат с временем и отсутствующими компонентами

При отсутствии времени в строке оно устанавливается в начало суток:

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

Результат:

  • 00:00:00 по локальному времени

Если указано только время без даты:

dayjs('14:30', 'HH:mm');

Дата устанавливается в текущий день окружения выполнения.


Некорректные даты и проверка результата

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

const d = dayjs('invalid date');
d.isValid();

Типичные причины невалидности:

  • несоответствие формату при строгом парсинге
  • невозможные значения (например, 32-й день месяца)
  • пустая строка

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

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

import 'dayjs/locale/ru';

dayjs.locale('ru');

Это влияет на интерпретацию текстовых форматов:

dayjs('22 май 2026', 'DD MMM YYYY');

Разбор относительных и нестандартных строк

Day.js не поддерживает естественный язык (например, “next Monday”) без дополнительных плагинов. Такие строки требуют сторонних расширений и не входят в базовый функционал.


Типичные проблемы при разборе строк

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

  • различие между MM и mm
  • путаница в порядке DD/MM/YYYY и MM/DD/YYYY
  • отсутствие строгого режима при критичных данных
  • использование локальных форматов вместо ISO

Пример неоднозначности:

dayjs('05-06-2026'); // может трактоваться как 5 июня или 6 мая

Явное указание формата устраняет неоднозначность:

dayjs('05-06-2026', 'DD-MM-YYYY', true);

Разбор и временные зоны

Day.js по умолчанию работает в локальной временной зоне окружения. При разборе строк с указанием UTC:

dayjs('2026-05-22T14:30:00Z');

символ Z фиксирует UTC-время.

Для расширенного управления зонами используется плагин utc, позволяющий явно контролировать интерпретацию входных строк и их нормализацию в UTC.