В системе форматирования Moment.js каждый символ шаблона может быть
интерпретирован как управляющий токен. Это означает, что
последовательности вроде YYYY, MM,
DD, HH не воспринимаются как обычный текст, а
преобразуются в соответствующие части даты.
Такой механизм удобен для генерации дат, но создаёт ключевую проблему: необходимость вывода в строке буквальных символов, которые совпадают с токенами форматирования. Например, если требуется вывести строку вида:
2026 year (05 month)
то простая попытка написать формат:
moment().format("YYYY year (MM month)")
даст неожиданный результат, поскольку year и
month содержат символы, которые не являются токенами, но
сам шаблон остаётся чувствительным к ключевым последовательностям.
В Moment.js для защиты текстовых частей формата используется механизм квадратных скобок:
всё, что заключено в [], воспринимается как
литеральный текст
Это ключевое правило, определяющее работу с любыми неконтролируемыми или конфликтующими символами в форматной строке.
moment().format("YYYY [year] MM [month]")
Результат:
2026 year 05 month
Содержимое в квадратных скобках выводится без обработки, независимо от того, совпадает ли оно с токенами Moment.js или нет.
Любое слово, которое может быть интерпретировано как набор токенов
или просто должно быть выведено дословно, помещается в
[].
moment().format("DD [день] MM [месяц] YYYY [год]")
Результат:
21 день 05 месяц 2026 год
moment().format("[Дата:] DD.MM.YYYY [время:] HH:mm")
Результат:
Дата: 21.05.2026 время: 14:35
Некоторые символы в Moment.js имеют особое значение и не могут быть использованы напрямую без риска интерпретации.
Y → годM → месяцD → деньH / h → часыm → минутыs → секундыЛюбая комбинация этих символов в строке может быть распознана как формат.
moment().format("YYYY-MM-DD [format]")
Если забыть про экранирование в других частях строки, можно получить неожиданный результат при сложных конструкциях, например:
moment().format("YYYY MM DD date")
Здесь date безопасен, но в реальных шаблонах с
динамическими частями часто возникают конфликты.
Квадратные скобки позволяют экранировать не только отдельные слова, но и целые фразы.
moment().format("[Сегодняшняя дата:] DD.MM.YYYY [формируется автоматически]")
Результат:
Сегодняшняя дата: 21.05.2026 формируется автоматически
Важно, что внутри [] никакая интерпретация не
происходит: ни разбиение, ни анализ токенов.
При построении сложных шаблонов часто комбинируются несколько типов данных: дата, время, статический текст, разделители.
moment().format("[Отчёт за:] MMMM YYYY, [сформирован:] HH:mm:ss [по местному времени]")
Результат:
Отчёт за: Май 2026, сформирован: 14:35:10 по местному времени
Каждый фрагмент текста изолирован скобками, что делает формат предсказуемым.
moment().format("Сегодня DD MM YYYY год")
Визуально кажется корректным, но логика форматирования нарушается:
слово год не защищено и может конфликтовать в расширенных
локализациях или сложных шаблонах.
moment().format("[Сегодня] DD MM YYYY [год]")
При работе с локалями экранирование становится критически важным, так как языковые строки часто содержат слова, пересекающиеся с форматными токенами.
moment().format("[Дата:] DD MMMM YYYY")
В русской локали:
Дата: 21 Май 2026
Без скобок библиотека могла бы попытаться интерпретировать часть строки как форматные элементы.
При сборке формата программно часто используются переменные, и экранирование применяется уже на уровне шаблона.
const label = "Создано";
const format = `[${label}:] DD.MM.YYYY`;
moment().format(format);
Результат:
Создано: 21.05.2026
Здесь важно, что скобки защищают уже готовую строку после подстановки переменной.
Квадратные скобки не только предотвращают интерпретацию токенов, но и стабилизируют вывод в ситуациях, когда формат собирается из разных источников.
Особенно это важно при:
Любая часть, которая не должна быть интерпретирована, обязана быть изолирована скобками.
Формат Moment.js допускает чередование интерпретируемых и литеральных частей без ограничений.
moment().format("DD [дня месяца] MMMM [в году] YYYY [г.] HH:mm")
Результат:
21 дня месяца Май в году 2026 г. 14:35
Такая структура делает возможным создание читаемых, естественных строк без потери точности форматирования.
Moment.js не поддерживает вложенные скобки как структуру. Любые
символы внутри [] рассматриваются как обычный текст.
moment().format("[Текст [внутри] скобок] DD.MM.YYYY")
Результат:
Текст [внутри] скобок 21.05.2026
Вложенность не обрабатывается, а внутренние скобки становятся частью строки.
Использование квадратных скобок является единственным официальным способом экранирования в Moment.js. Альтернативные методы, такие как обратные слеши или специальные символы, не применяются и игнорируются форматтером.
Это делает систему предсказуемой:
[].Других режимов поведения не предусмотрено.