Форматирование календарных дат

Библиотека Moment.js предоставляет мощные инструменты для работы с датами и временем, включая гибкое форматирование. Форматирование позволяет преобразовать объект moment в строку, удобную для отображения пользователю, хранения или передачи между системами. Ключевым методом для этих целей является .format().

const moment = require('moment');
let now = moment();
console.log(now.format()); // По умолчанию ISO 8601

Метод .format() принимает строку-шаблон, содержащую специальные символы для отображения компонентов даты и времени.


Стандартные токены форматирования

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

  • Год

    • YYYY — полный год (например, 2026)
    • YY — две последние цифры года (например, 26)
  • Месяц

    • M — месяц без ведущего нуля (1–12)
    • MM — месяц с ведущим нулем (01–12)
    • MMM — сокращённое название месяца (Jan, Feb)
    • MMMM — полное название месяца (January, February)
  • День месяца

    • D — день без ведущего нуля (1–31)
    • DD — день с ведущим нулем (01–31)
  • День недели

    • d — день недели (0–6, 0 — воскресенье)
    • dd — сокращённое название дня недели (Su, Mo)
    • ddd — сокращённое слово (Sun, Mon)
    • dddd — полное название дня (Sunday, Monday)
  • Часы

    • H — 24-часовой формат без ведущего нуля (0–23)
    • HH — 24-часовой формат с ведущим нулем (00–23)
    • h — 12-часовой формат без ведущего нуля (1–12)
    • hh — 12-часовой формат с ведущим нулем (01–12)
  • Минуты и секунды

    • m / mm — минуты
    • s / ss — секунды
  • AM/PM

    • A — AM или PM
    • a — am или pm
  • Части времени и миллисекунды

    • SSS — миллисекунды (000–999)
    • Z — смещение временной зоны (+05:00)
    • ZZ — смещение временной зоны без двоеточия (+0500)

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

let date = moment('2026-05-21T14:30:45');
console.log(date.format('YYYY/MM/DD HH:mm:ss')); // 2026/05/21 14:30:45
console.log(date.format('dddd, MMMM D, YYYY h:mm A')); // Thursday, May 21, 2026 2:30 PM

Форматирование локалей

Moment.js поддерживает интернационализацию, что позволяет выводить дату в формате, соответствующем выбранной локали. Локаль задаётся через метод .locale():

moment.locale('ru'); // Устанавливаем русскую локаль
let date = moment('2026-05-21');
console.log(date.format('LLLL')); // четверг, 21 мая 2026 г., 00:00

С помощью локализации можно автоматически получать названия месяцев и дней недели на нужном языке, а также корректное отображение AM/PM, если это применимо.


Предопределённые форматы

Помимо ручного задания шаблонов, Moment.js предлагает предопределённые форматы для стандартных случаев:

  • LT — часы и минуты (2:30 PM)
  • LTS — часы, минуты, секунды (2:30:45 PM)
  • L — короткая дата (05/21/2026)
  • LL — длинная дата (May 21, 2026)
  • LLL — длинная дата с временем (May 21, 2026 2:30 PM)
  • LLLL — полный формат с днём недели (Thursday, May 21, 2026 2:30 PM)

Предопределённые форматы автоматически адаптируются под локаль:

moment.locale('ru');
console.log(moment().format('LL')); // 21 мая 2026 г.
console.log(moment().format('LLLL')); // четверг, 21 мая 2026 г., 14:30

Пользовательские шаблоны и литералы

В шаблонах форматирования можно использовать литералы, заключая их в квадратные скобки [], чтобы они не воспринимались как токены:

let date = moment('2026-05-21');
console.log(date.format('[Сегодня] DD [число месяца]')); // Сегодня 21 число месяца

Это полезно для включения текста или символов, не связанных с датой.


Работа с часами, минутами и секундами

Для точного форматирования времени можно комбинировать 24-часовой и 12-часовой форматы, добавлять ведущие нули или отображать миллисекунды:

let time = moment('14:05:09.123', 'HH:mm:ss.SSS');
console.log(time.format('HH:mm:ss.SSS')); // 14:05:09.123
console.log(time.format('h:mm:ss A')); // 2:05:09 PM

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


Выравнивание и паддинг

Moment.js поддерживает выравнивание чисел с помощью ведущих нулей (DD, MM, HH, mm, ss) для удобного отображения и сортировки строк:

let day = moment('2026-05-07');
console.log(day.format('DD/MM/YYYY')); // 07/05/2026

Без ведущего нуля (D, M) вывод был бы: 7/5/2026.


Составные форматы и комбинирование

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

let date = moment('2026-05-21T14:30');
console.log(date.format('dddd, D MMMM YYYY [в] HH:mm')); // четверг, 21 мая 2026 в 14:30

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


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

  • Использовать .format() с явным шаблоном для единообразия.
  • Применять локали для интернационализации.
  • Использовать литералы для фиксированного текста.
  • Для экспорта или хранения даты предпочтителен ISO-формат YYYY-MM-DDTHH:mm:ssZ.

Правильное форматирование дат и времени обеспечивает читаемость, консистентность и поддержку международных стандартов.