В реальных задачах обработки дат данные редко поступают в едином стандартизированном виде. Чаще встречаются смешанные представления: ISO-строки, локальные форматы, сокращённые записи, временные метки, а также пользовательские варианты. В таких условиях Day.js используется не как строгий парсер одного формата, а как слой нормализации входных значений.
Базовое поведение Day.js при разборе строки ограничено ISO-8601 и частично совместимыми форматами. Для расширенной обработки применяется плагин CustomParseFormat, позволяющий задавать набор допустимых шаблонов.
Для работы с множественными форматами требуется подключение плагина:
import dayjs from 'dayjs'
import customParseFormat from 'dayjs/plugin/customParseFormat'
dayjs.extend(customParseFormat)
После расширения становится доступен разбор строк с указанием одного или нескольких форматов.
Ключевая возможность — передача массива шаблонов. Day.js последовательно проверяет каждый формат до первого успешного совпадения.
const dateStr = '12-03-2025'
const formats = [
'YYYY/MM/DD',
'DD-MM-YYYY',
'MM-DD-YYYY'
]
const result = dayjs(dateStr, formats)
Механика работы:
Для исключения неоднозначных интерпретаций используется строгий режим. Он запрещает частичное соответствие формату.
dayjs(dateStr, formats, true)
Особенности строгого режима:
При использовании массива форматов порядок элементов становится значимым. Day.js не анализирует “наилучшее совпадение”, а использует первый успешный результат.
Пример:
const formats = [
'MM/DD/YYYY',
'DD/MM/YYYY'
]
В неоднозначных случаях (например, 01/02/2025) выбор
формата зависит исключительно от порядка:
MM/DD/YYYY, интерпретация будет как 1
февраля;DD/MM/YYYY, интерпретация будет как 1
января.Это требует явного контроля при проектировании списка форматов.
В прикладных системах часто комбинируются разные типы дат:
2025-03-1212.03.202503/12/202520250312Для унификации используется единый набор правил:
const formats = [
'YYYY-MM-DD',
'DD.MM.YYYY',
'MM/DD/YYYY',
'YYYYMMDD'
]
function parseDate(input) {
const parsed = dayjs(input, formats, true)
return parsed.isValid() ? parsed : null
}
Такой подход превращает Day.js в слой нормализации поверх неоднородных источников данных.
После попытки разбора необходимо проверять валидность результата:
const d = dayjs(input, formats, true)
if (d.isValid()) {
// корректная дата
} else {
// некорректный формат или несоответствие шаблонам
}
Метод isValid() опирается на внутреннее состояние
объекта и позволяет отфильтровывать нераспознанные значения.
Форматы могут зависеть от локальных соглашений. При использовании локализации важно учитывать различия в порядке дня и месяца.
import 'dayjs/locale/ru'
dayjs.locale('ru')
Однако локаль не заменяет явное указание форматов при парсинге массива. Она влияет только на отображение и некоторые операции форматирования.
После нормализации входной даты часто требуется вывести её в нескольких форматах одновременно.
const d = dayjs('2025-03-12', formats, true)
const outputs = {
iso: d.format('YYYY-MM-DD'),
readable: d.format('DD MMMM YYYY'),
compact: d.format('YYYYMMDD')
}
Таким образом один объект даты служит источником для различных представлений без повторного парсинга.
Типичная задача — преобразование строки из неизвестного формата в строго заданный.
function convertDate(input) {
const d = dayjs(input, formats, true)
if (!d.isValid()) return null
return d.format('YYYY-MM-DD')
}
Такой подход устраняет зависимость от исходного формата и приводит данные к единому стандарту хранения.
Некоторые входные строки могут соответствовать сразу нескольким форматам. В таких случаях используется стратегия:
Пример простой детекции:
function detectFormat(str) {
if (str.includes('-')) return 'YYYY-MM-DD'
if (str.includes('/')) return 'MM/DD/YYYY'
if (str.includes('.')) return 'DD.MM.YYYY'
return 'YYYYMMDD'
}
Далее результат передаётся в Day.js:
dayjs(input, detectFormat(input), true)
При обработке коллекций данных применяется единый пайплайн:
const inputs = [
'2025-03-12',
'12.03.2025',
'03/12/2025'
]
const normalized = inputs
.map(i => dayjs(i, formats, true))
.filter(d => d.isValid())
.map(d => d.format('YYYY-MM-DD'))
Это обеспечивает унификацию независимо от исходного источника данных.
При работе с несколькими шаблонами важно учитывать особенности:
Эти ограничения делают явное управление форматами обязательным элементом архитектуры обработки дат.
В крупных системах набор форматов выделяется в отдельный модуль:
export const DATE_FORMATS = [
'YYYY-MM-DD',
'DD.MM.YYYY',
'MM/DD/YYYY',
'YYYYMMDD',
'YYYY-MM-DDTHH:mm:ss'
]
Использование централизованного списка:
Полный цикл работы с датой в условиях множественных форматов сводится к последовательной композиции операций:
function normalize(input) {
const d = dayjs(input, DATE_FORMATS, true)
if (!d.isValid()) return null
return {
iso: d.format('YYYY-MM-DD'),
timestamp: d.valueOf(),
display: d.format('DD MMMM YYYY')
}
}
Такая схема отделяет:
При интеграции с внешними API, базами данных и пользовательскими интерфейсами многоформатный парсинг используется как промежуточный слой. Его задача — исключить зависимость бизнес-логики от конкретного формата представления даты и обеспечить детерминированное поведение при любых входных данных.