Форматирование дат в date-fns основано на
строках-шаблонах, состоящих из токенов. Каждый токен представляет собой
строго определённую часть даты или времени и интерпретируется функцией
форматирования при преобразовании объекта Date в
строку.
Основной механизм реализуется через функцию:
format(date, formatString)
где formatString — строка, состоящая из комбинации
токенов и литерального текста.
Токены в date-fns чувствительны к регистру и строго регламентированы:
yyyy и YYYY могут означать разные сущности
в разных системах, но в date-fns используется именно yyyy
для годаMM — месяц, а mm — минутыdd — день месяцаHH — часы в 24-часовом форматеКлючевая особенность — отсутствие «магии»: каждый символ имеет фиксированное значение, и любое отклонение от стандарта приводит к интерпретации как обычного текста.
y — сокращённый год (например, 2026 → 26)yy — двухзначный годyyyy — полный годyo — год с порядковым суффиксом (1st, 2nd и т.п. в
локализованных форматах)Примеры:
format(new Date(2026, 0, 15), 'yyyy') // 2026
format(new Date(2026, 0, 15), 'yy') // 26
Месяцы в date-fns имеют несколько представлений: числовое, текстовое и сокращённое.
M — месяц без ведущего нуля (1–12)MM — месяц с ведущим нулём (01–12)MMM — короткое название месяца (Jan, Feb…)MMMM — полное название месяца (January, February…)Пример:
format(new Date(2026, 0, 15), 'MM') // 01
format(new Date(2026, 0, 15), 'MMMM') // January
d — день месяца (1–31)dd — день месяца с ведущим нулём (01–31)do — день месяца с порядковым суффиксом (1st, 2nd,
3rd)format(new Date(2026, 0, 3), 'do') // 3rd
E — краткое обозначение дня неделиEEE — сокращённое название дняEEEE — полное название дня неделиformat(new Date(2026, 0, 15), 'EEEE') // Thursday
H — часы в 24-часовом формате без нуля (0–23)HH — 24-часовой формат с нулём (00–23)h — 12-часовой формат без нуля (1–12)hh — 12-часовой формат с нулём (01–12)a — AM/PM маркерformat(new Date(2026, 0, 15, 9, 5), 'HH:mm') // 09:05
format(new Date(2026, 0, 15, 21, 5), 'hh:mm a') // 09:05 PM
m — минуты без нуля (0–59)mm — минуты с нулёмs — секунды без нуляss — секунды с нулёмformat(new Date(2026, 0, 15, 10, 3, 7), 'mm:ss') // 03:07
S — сотые доли секундыSS — десятки миллисекундSSS — миллисекунды полностью (000–999)format(new Date(2026, 0, 15, 10, 0, 0, 123), 'SSS') // 123
Кварталы полезны для финансовых и аналитических задач.
Q — номер квартала (1–4)QQ — с ведущим нулёмQo — порядковое представлениеformat(new Date(2026, 4, 1), 'Qo') // 2nd
Токен o используется для преобразования чисел в
порядковые формы:
do — день месяца с суффиксомMo — месяц с суффиксомQo — квартал с суффиксомМеханизм зависит от локали и поддерживает правила языков.
Любой текст, не являющийся токеном, интерпретируется как строка форматирования. Однако при совпадении с токенами требуется экранирование.
Используются одинарные кавычки:
format(new Date(), "'Today is' yyyy-MM-dd")
Результат:
Today is 2026-05-22
текст внутри ' ' не интерпретируется как
токены
для вставки кавычки используется удвоение:
"'It''s date'"date-fns предоставляет набор готовых шаблонов:
P — краткий формат датыPP — средний формат датыPPP — расширенный формат датыPPPP — полный формат датыp — времяpp — расширенное времяПример:
format(new Date(2026, 0, 15), 'PPP')
Эти пресеты зависят от локали и позволяют стандартизировать вывод без ручного составления строк.
Токены строго различают регистр:
MM — месяцmm — минутыОшибочный выбор приводит к некорректному результату без исключения, так как библиотека интерпретирует строку буквально.
Пример типичной ошибки:
format(date, 'yyyy-mm-dd') // mm = минуты, а не месяц
Форматирование строится через композицию:
format(new Date(2026, 0, 15, 9, 30), 'yyyy-MM-dd HH:mm:ss')
Результат:
2026-01-15 09:30:00
Более сложные шаблоны:
format(
new Date(2026, 0, 15, 9, 30),
"EEEE, do 'of' MMMM yyyy, hh:mm a"
)
Некоторые токены зависят от локали:
MMMM)EEEE)do, Mo)Локализация передаётся через объект опций:
format(date, 'PPPP', { locale })
Любой неизвестный фрагмент строки:
Это делает форматирование устойчивым, но требует внимательности при написании шаблонов.
Форматирование не изменяет сам объект Date. Оно лишь
читает его компоненты:
getFullYear()getMonth()getDate()getHours()getMinutes()getSeconds()Каждый токен сопоставляется с соответствующим методом извлечения данных.
При построении сложных форматов используется структурирование:
Пример:
"yyyy-MM-dd 'at' HH:mm:ss"
YYYY вместо yyyymm (минуты) и MM (месяцы)hh
vs HH)Эти ошибки приводят к корректному, но неожиданному выводу.
Различие 12- и 24-часовых форматов критично:
HH — сутки 0–23hh — часы 1–12 с AM/PMformat(date, 'HH:mm') // 18:00
format(date, 'hh:mm a') // 06:00 PM