Функция formatRelative предназначена для отображения дат
в человекочитаемом виде с учётом контекста между двумя моментами
времени. В отличие от абсолютного форматирования (format) и
чисто разностного (formatDistance), здесь используется
сравнительная логика: дата интерпретируется относительно базовой точки
отсчёта.
Основная идея заключается в том, что одна и та же дата может отображаться по-разному в зависимости от того, к какому моменту она привязана.
Например:
Функция имеет следующую сигнатуру:
formatRelative(date, baseDate, [options])
date — дата, которую необходимо отобразитьbaseDate — точка отсчёта (контекстная дата)options — дополнительные настройки (локализация и
форматирование)Возвращаемое значение — строка с локализованным представлением даты
относительно baseDate.
Контекстное форматирование строится на сравнении двух временных точек:
Алгоритм не просто вычисляет разницу, а выбирает заранее заданный шаблон из локализации.
Вся логика formatRelative зависит от объекта locale.
Внутри каждой локали определены шаблоны для разных сценариев:
Пример структуры локали:
const locale = {
formatRelative: (token, date, baseDate, options) => {
return mapping[token];
}
}
На практике используется готовая локаль, например enUS,
ru, de.
Функция использует внутренние токены, которые определяют тип относительности:
lastWeekyesterdaytodaytomorrownextWeekotherКаждый токен соответствует конкретному шаблону строки.
Пример:
today → “сегодня в p”yesterday → “вчера в p”nextWeek → “в следующую EEEE в p”Ключевой параметр — baseDate. Именно он определяет
контекст:
import { formatRelative } from 'date-fns'
formatRelative(new Date(2026, 4, 22, 15, 0), new Date(2026, 4, 21))
Здесь результат будет зависеть от того, попадает ли дата в диапазон
«сегодня», «вчера» или «завтра» относительно baseDate.
Сдвиг baseDate меняет всю интерпретацию результата без
изменения самой даты.
import { formatRelative } from 'date-fns'
const date = new Date(2026, 4, 22, 18, 30)
const base = new Date(2026, 4, 21, 12, 0)
formatRelative(date, base)
// "завтра в 18:30"
При изменении base результат может стать другим:
const base = new Date(2026, 4, 20, 12, 0)
formatRelative(date, base)
// "через 2 дня в 18:30"
formatDistance возвращает числовую разницу:
formatRelative добавляет контекст:
Разница принципиальная:
| Функция | Результат | Характер |
|---|---|---|
| formatDistance | 2 дня | количественный |
| formatRelative | вчера | контекстный |
format полностью игнорирует контекст:
format(date, 'yyyy-MM-dd HH:mm')
Результат всегда одинаковый.
formatRelative динамически меняет строку в зависимости
от baseDate.
При подключении русской локали поведение становится значительно богаче:
import { formatRelative } from 'date-fns'
import { ru } from 'date-fns/locale'
formatRelative(date, base, { locale: ru })
В русской локализации используются естественные конструкции:
Внутри строк локали используется токен p, который
подставляет локализованное время.
Примеры:
today at pyesterday at pnextWeek on EEEE at pГде:
p — локализованное времяEEEE — день недели полностьюОдним из сложных моментов является переход между неделями.
Если дата попадает:
today /
yesterdaynextWeeklastWeekЭто зависит от локали и настроек начала недели.
Некоторые локали используют понедельник как начало недели, другие — воскресенье.
Это влияет на классификацию:
Таким образом, formatRelative не является чисто
математической функцией — он зависит от культурного контекста.
"сегодня в 12:45"
"вчера в 18:20"
"в понедельник в 09:00"
Контекст делает интерфейс естественным без лишних вычислений.
Позволяет сгруппировать события по времени без потери точности.
date: 22 мая 18:00
base: 22 мая 23:00
Результат может быть «сегодня в 18:00», несмотря на то что разница отрицательная.
Переход границы суток — ключевой момент, определяющий выбор шаблона.
formatRelative работает с объектами Date,
поэтому таймзона уже должна быть учтена до вызова функции. Иначе
возможны некорректные «сегодня/вчера».
При массовом форматировании (например, списки сообщений) важно учитывать:
locale объектDateРучная реализация обычно включает:
formatRelative заменяет всю эту логику одной функцией,
но требует доверия к локали.
baseDateformatDistanceПри некорректных входных данных функция возвращает
Invalid Date, если используется некорректный
Date объект.
formatRelative можно рассматривать как слой над тремя
механизмами:
Эта комбинация позволяет создавать интерфейсы, где время воспринимается естественно и без избыточной точности.