Библиотека date-fns предоставляет набор функций для форматирования и
преобразования дат без изменения исходного объекта Date.
Все операции строятся вокруг чистых функций и модульной архитектуры.
Главная функция форматирования:
import { format } from 'date-fns'
const date = new Date(2026, 4, 22)
console.log(format(date, 'dd.MM.yyyy'))
// 22.05.2026
Функция format() принимает:
Date;| Токен | Описание | Пример |
|---|---|---|
d |
день без ведущего нуля | 5 |
dd |
день с ведущим нулём | 05 |
format(new Date(2026, 4, 5), 'd')
format(new Date(2026, 4, 5), 'dd')
| Токен | Описание | Пример |
|---|---|---|
M |
месяц без нуля | 5 |
MM |
месяц с нулём | 05 |
MMM |
краткое название | May |
MMMM |
полное название | May |
format(date, 'MM')
format(date, 'MMMM')
| Токен | Описание | Пример |
|---|---|---|
yy |
короткий год | 26 |
yyyy |
полный год | 2026 |
format(date, 'yyyy')
| Токен | Описание |
|---|---|
H |
часы 0–23 |
HH |
часы с нулём |
m |
минуты |
mm |
минуты с нулём |
s |
секунды |
ss |
секунды с нулём |
format(new Date(), 'HH:mm:ss')
Формы дат формируются путём объединения токенов.
format(date, 'dd.MM.yyyy')
format(date, 'yyyy-MM-dd')
format(date, 'dd MMMM yyyy')
Результат:
22.05.2026
2026-05-22
22 May 2026
Любой текст внутри одинарных кавычек считается литералом.
format(date, "dd.MM.yyyy 'год'")
Результат:
22.05.2026 год
import { format } from 'date-fns'
import { ru } from 'date-fns/locale'
const date = new Date()
console.log(
format(date, 'd MMMM yyyy', {
locale: ru
})
)
Результат:
22 мая 2026
MM и
mmОдна из самых распространённых ошибок — путаница между месяцами и минутами.
| Токен | Значение |
|---|---|
MM |
месяц |
mm |
минуты |
Неправильно:
format(date, 'HH:MM')
Правильно:
format(date, 'HH:mm')
format(date, "yyyy-MM-dd'T'HH:mm:ss")
Пример:
2026-05-22T14:30:00
format(date, 'dd.MM.yyyy')
Результат:
22.05.2026
format(date, 'EEEE, d MMMM yyyy')
Результат:
Friday, 22 May 2026
format(date, 'HH:mm')
format(date, 'HH:mm:ss')
| Токен | Описание |
|---|---|
h |
часы 1–12 |
hh |
часы с нулём |
a |
AM/PM |
format(date, 'hh:mm a')
Результат:
02:30 PM
const timestamp = 1747900000000
format(new Date(timestamp), 'dd.MM.yyyy')
const now = new Date()
format(now, 'dd.MM.yyyy HH:mm')
Библиотека поддерживает представление времени в виде относительных выражений.
formatDistanceimport { formatDistance } from 'date-fns'
const result = formatDistance(
new Date(2026, 4, 1),
new Date(2026, 4, 10)
)
console.log(result)
Результат:
9 days
import { ru } from 'date-fns/locale'
formatDistance(
new Date(2026, 4, 1),
new Date(2026, 4, 10),
{
locale: ru
}
)
Результат:
9 дней
formatDistanceToNowФункция показывает расстояние до текущего момента.
import { formatDistanceToNow } from 'date-fns'
formatDistanceToNow(
new Date(2026, 4, 20)
)
Результат:
2 days
formatDistanceToNow(date, {
addSuffix: true
})
Результат:
in 5 days
или:
5 days ago
formatRelativeФункция отображает дату относительно текущего дня.
import { formatRelative } from 'date-fns'
formatRelative(
new Date(2026, 4, 22),
new Date(2026, 4, 20)
)
Результат:
Friday at 12:00 AM
import { formatRFC3339 } from 'date-fns'
formatRFC3339(new Date())
import { formatISO } from 'date-fns'
formatISO(new Date())
formatISO(new Date(), {
representation: 'date'
})
Результат:
2026-05-22
P и PPPPDate-fns поддерживает локализованные шаблоны.
| Токен | Формат |
|---|---|
P |
короткий |
PP |
средний |
PPP |
длинный |
PPPP |
полный |
format(date, 'P')
format(date, 'PPPP')
| Токен | Формат |
|---|---|
p |
короткое время |
pp |
среднее |
ppp |
длинное |
pppp |
полное |
format(date, 'pp')
format(date, 'PPpp')
Базовая библиотека Date-fns не управляет часовыми поясами напрямую. Для этого используется пакет:
npm install date-fns-tz
formatInTimeZoneimport { formatInTimeZone } from 'date-fns-tz'
formatInTimeZone(
new Date(),
'Europe/Moscow',
'dd.MM.yyyy HH:mm:ss'
)
format(date, 'yyyy-MM-dd')
format(date, 'HH:mm')
format(new Date(), 'yyyyMMdd_HHmmss')
Результат:
20260522_143015
format(
new Date(),
'yyyy-MM-dd HH:mm:ss.SSS'
)
| Токен | Значение |
|---|---|
S |
миллисекунды |
SS |
две цифры |
SSS |
три цифры |
format(date, 'HH:mm:ss.SSS')
| Токен | Описание |
|---|---|
E |
краткий день |
EEEE |
полный день |
format(date, 'EEEE')
| Токен | Значение |
|---|---|
D |
день года |
DD |
день года с нулём |
format(date, 'D')
format(date, 'w')
| Токен | Значение |
|---|---|
Q |
номер квартала |
QQQQ |
текстовый квартал |
format(date, 'QQQQ')
Перед форматированием необходимо проверять корректность даты.
import { isValid } from 'date-fns'
const date = new Date('invalid')
if (isValid(date)) {
console.log(format(date, 'dd.MM.yyyy'))
}
format(date, 'YYYY')
В Date-fns используется:
format(date, 'yyyy')
Неправильно:
format('2026-05-22', 'dd.MM.yyyy')
Правильно:
format(new Date('2026-05-22'), 'dd.MM.yyyy')
Date-fns импортирует только используемые функции.
import { format } from 'date-fns'
Такой подход уменьшает размер итогового bundle.
format(user.createdAt, 'dd.MM.yyyy')
formatDistanceToNow(post.createdAt, {
addSuffix: true
})
format(date, "yyyy-MM-dd'T'HH:mm:ssXXX")
format(date, 'EEEE, d MMMM')
| Назначение | Формат |
|---|---|
| Российская дата | dd.MM.yyyy |
| Международная дата | yyyy-MM-dd |
| Время | HH:mm:ss |
| ISO | yyyy-MM-dd'T'HH:mm:ss |
| Дата и время | dd.MM.yyyy HH:mm |
| Имя файла | yyyyMMdd_HHmmss |
Intl.DateTimeFormatformat(date, 'dd.MM.yyyy')
new Intl.DateTimeFormat('ru-RU')
.format(date)
Date-fns предоставляет:
import { format } from 'date-fns'
export function formatDate(date) {
return format(date, 'dd.MM.yyyy')
}
import { format, isValid } from 'date-fns'
export function safeFormat(date) {
if (!isValid(date)) {
return ''
}
return format(date, 'dd.MM.yyyy')
}