Комбинирование токенов

В библиотеке Moment.js токены используются для форматирования и разбора дат. Комбинирование токенов позволяет создавать сложные шаблоны отображения даты и времени, адаптированные под требования интерфейса, локали или бизнес-логики.

Одиночные токены отвечают за отдельные части даты:

Токен Значение
YYYY Год
MM Месяц
DD День
HH Часы
mm Минуты
ss Секунды

Комбинация нескольких токенов формирует полноценный шаблон.


Базовое комбинирование токенов

const moment = require('moment');

const date = moment();

console.log(date.format('YYYY-MM-DD'));

Результат:

2026-05-21

Здесь используется комбинация:

  • YYYY — полный год
  • MM — месяц
  • DD — день

Символ - не является токеном и выводится как обычный текст.


Комбинирование даты и времени

console.log(
    moment().format('YYYY-MM-DD HH:mm:ss')
);

Результат:

2026-05-21 14:37:52

Комбинация включает:

Токен Описание
YYYY Год
MM Месяц
DD День
HH Часы в 24-часовом формате
mm Минуты
ss Секунды

Использование разделителей

Токены можно комбинировать с любыми разделителями.

Точка

moment().format('DD.MM.YYYY');

Результат:

21.05.2026

Косая черта

moment().format('DD/MM/YYYY');

Результат:

21/05/2026

Текстовые разделители

moment().format('DD - MM - YYYY');

Результат:

21 - 05 - 2026

Форматирование с текстом

Обычный текст можно смешивать с токенами.

moment().format('Сегодня: DD.MM.YYYY');

Результат:

Сегодня: 21.05.2026

Однако некоторые символы могут быть восприняты как токены. Для безопасного вывода текста используются квадратные скобки.


Экранирование текста

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

moment().format('[Дата:] DD.MM.YYYY');

Результат:

Дата: 21.05.2026

Несколько блоков:

moment().format('[Год:] YYYY [Месяц:] MM');

Результат:

Год: 2026 Месяц: 05

Комбинирование локализованных токенов

Moment.js содержит специальные локализованные шаблоны.

Токен Значение
L Короткая дата
LL Полная дата
LLL Дата и время
LLLL Полная дата с днём недели

Пример:

moment.locale('ru');

console.log(moment().format('LL'));

Результат:

21 мая 2026 г.

Смешивание локализованных и обычных токенов

moment.locale('ru');

console.log(
    moment().format('LLLL HH:mm')
);

Результат:

четверг, 21 мая 2026 г. 14:37

LLLL формирует локализованную дату, а HH:mm добавляет точное время.


Комбинирование токенов времени

24-часовой формат

moment().format('HH:mm:ss');

Результат:

14:37:52

12-часовой формат

moment().format('hh:mm:ss A');

Результат:

02:37:52 PM

Токен A добавляет AM или PM.


Комбинирование миллисекунд

moment().format('HH:mm:ss.SSS');

Результат:

14:37:52.145
Токен Значение
S Десятые
SS Сотые
SSS Миллисекунды

Формирование ISO-подобных строк

moment().format('YYYY-MM-DDTHH:mm:ss');

Результат:

2026-05-21T14:37:52

Символ T здесь используется как обычный текст.

Более безопасный вариант:

moment().format('YYYY-MM-DD[T]HH:mm:ss');

Комбинирование временных зон

Токен Значение
Z Смещение timezone
ZZ Смещение без двоеточия

Пример:

moment().format('YYYY-MM-DD HH:mm:ss Z');

Результат:

2026-05-21 14:37:52 +06:00

Комбинирование дня недели

moment.locale('ru');

console.log(
    moment().format('dddd, DD MMMM YYYY')
);

Результат:

четверг, 21 мая 2026

Разбор:

Токен Значение
dddd Полное название дня недели
MMMM Полное название месяца

Краткие и полные комбинации

Короткий формат

moment().format('DD.MM.YY');

Результат:

21.05.26

Полный формат

moment().format('dddd, DD MMMM YYYY HH:mm:ss');

Результат:

четверг, 21 мая 2026 14:37:52

Сложные комбинированные шаблоны

moment.locale('ru');

console.log(
    moment().format(
        '[Сегодня:] dddd, DD MMMM YYYY [в] HH:mm:ss'
    )
);

Результат:

Сегодня: четверг, 21 мая 2026 в 14:37:52

Здесь одновременно используются:

  • текстовые блоки;
  • локализация;
  • дата;
  • время;
  • пользовательские разделители.

Комбинирование токенов при парсинге

Токены применяются не только в format(), но и в разборе строк.

const date = moment(
    '21-05-2026 14:30',
    'DD-MM-YYYY HH:mm'
);

console.log(date.format());

Шаблон сообщает библиотеке, как интерпретировать входную строку.


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

Moment.js поддерживает массив шаблонов.

const date = moment(
    '21/05/2026',
    [
        'DD-MM-YYYY',
        'DD/MM/YYYY',
        'YYYY-MM-DD'
    ]
);

Библиотека последовательно проверяет форматы.


Комбинирование токенов с ordinal-формами

Токен Пример
Do 1st, 2nd
Mo 1st month

Пример:

moment.locale('en');

console.log(
    moment().format('MMMM Do YYYY')
);

Результат:

May 21st 2026

Комбинирование сокращённых и полных токенов

moment.locale('ru');

console.log(
    moment().format('ddd, D MMM YYYY')
);

Результат:

чт, 21 май 2026
Токен Значение
ddd Краткий день недели
MMM Краткое название месяца

Комбинирование Unix-токенов

Токен Значение
X Unix timestamp в секундах
x Unix timestamp в миллисекундах
moment().format('X');

Результат:

1779363472

Комбинация:

moment().format('YYYY-MM-DD X');

Динамическое формирование шаблонов

Формат может собираться программно.

const includeTime = true;

const format = includeTime
    ? 'DD.MM.YYYY HH:mm'
    : 'DD.MM.YYYY';

console.log(
    moment().format(format)
);

Подобный подход применяется в:

  • настройках локализации;
  • пользовательских интерфейсах;
  • системах отчётности;
  • экспорте данных.

Частые ошибки при комбинировании токенов

Ошибка с MM и mm

moment().format('HH:MM');

Неверно:

  • MM — месяц

Правильно:

moment().format('HH:mm');

Ошибка с DD и dd

Токен Значение
DD День месяца
dd Минимальное имя дня недели

Пример:

moment().format('dd');

Результат:

чт

Ошибка без экранирования

moment().format('Дата: DD.MM.YYYY');

Некоторые символы могут интерпретироваться как токены.

Безопасный вариант:

moment().format('[Дата:] DD.MM.YYYY');

Практические шаблоны

Логирование

moment().format(
    'YYYY-MM-DD HH:mm:ss.SSS'
);

URL-параметры

moment().format(
    'YYYYMMDD'
);

Человекочитаемый формат

moment().format(
    'DD MMMM YYYY, HH:mm'
);

Формат для API

moment().format(
    'YYYY-MM-DDTHH:mm:ssZ'
);

Влияние локали на комбинирование

Один и тот же шаблон при разных локалях выдаёт разный результат.

moment.locale('ru');

console.log(
    moment().format('dddd, MMMM')
);

Результат:

четверг, май

Английская локаль:

moment.locale('en');

console.log(
    moment().format('dddd, MMMM')
);

Результат:

Thursday, May

Читаемость сложных шаблонов

Длинные комбинации рекомендуется структурировать.

Плохо:

moment().format('dddd,DDMMMMYYYYHH:mm:ssZ');

Хорошо:

moment().format(
    'dddd, DD MMMM YYYY HH:mm:ss Z'
);

Рекомендации по построению шаблонов

Использование единообразия

Если в проекте используется:

YYYY-MM-DD

то этот формат желательно применять везде для машинного представления дат.


Отделение машинных и пользовательских форматов

Для API:

YYYY-MM-DDTHH:mm:ssZ

Для интерфейса:

DD.MM.YYYY HH:mm

Минимизация неоднозначности

Формат:

01/02/03

неочевиден.

Лучше:

2026-02-01

или:

01 Feb 2026

Совмещение токенов с методами Moment.js

const date = moment()
    .add(2, 'days')
    .subtract(3, 'hours');

console.log(
    date.format('DD.MM.YYYY HH:mm')
);

Комбинация методов модификации даты и сложных шаблонов форматирования активно используется в:

  • календарях;
  • системах бронирования;
  • CRM;
  • аналитике;
  • расписаниях;
  • логировании событий.