Функция formatDistanceStrict из date-fns предназначена
для получения строго выверенного текстового представления разницы между
двумя датами. В отличие от более «гибких» методов форматирования
расстояния, она не допускает округлений в сторону более крупных единиц
времени и избегает неоднозначных формулировок.
Основная цель — получение максимально точного, предсказуемого результата: «2 дня», «3 месяца», «7 минут», без перехода к более крупным или приблизительным единицам.
formatDistanceStrict(date, baseDate, [options])
Возвращаемое значение — строка с точным описанием разницы.
formatDistanceStrict вычисляет абсолютную разницу между
датами и выбирает наиболее подходящую единицу времени без
округления вверх.
Ключевой принцип:
Пример логики:
Главное различие между formatDistanceStrict и
formatDistance заключается в правилах округления и
интерпретации интервалов.
Пример различий:
formatDistance(date1, date2);
// about 1 hour
formatDistanceStrict(date1, date2);
// 59 minutes
Функция автоматически выбирает одну из следующих единиц:
Выбор зависит от величины интервала.
Добавляет направление относительности даты.
formatDistanceStrict(new Date(2026, 0, 1), new Date(2025, 0, 1), {
addSuffix: true
});
Результат:
"in 1 year"
Без addSuffix:
"1 year"
Определяет способ округления.
Доступные значения:
floor — округление вниз (по умолчанию)ceil — округление вверхround — математическое округлениеПример:
formatDistanceStrict(new Date(2025, 0, 2), new Date(2025, 0, 1), {
roundingMethod: "ceil"
});
Если разница составляет 1.1 дня, результат будет округлён до:
2 days
Позволяет локализовать вывод.
import { ru } from "date-fns/locale";
formatDistanceStrict(date1, date2, { locale: ru });
В этом случае результат будет на русском языке:
"1 день"
Одной из ключевых особенностей formatDistanceStrict
является строгое определение границ перехода между единицами
времени.
Месяцы вычисляются на основе календарных различий, а не фиксированного количества дней, что важно учитывать:
Если первая дата позже второй, результат автоматически инвертируется.
formatDistanceStrict(new Date(2025, 0, 1), new Date(2026, 0, 1));
Результат:
"1 year"
При добавлении addSuffix: true:
"1 year ago"
Используется для отображения времени до или после события без неоднозначности.
formatDistanceStrict(eventDate, new Date(), { addSuffix: true });
Результат:
"3 days ago"
В системах логирования требуется точная разница между событиями.
formatDistanceStrict(logEnd, logStart);
Пример:
"14 minutes"
В уведомлениях важно избегать размытых формулировок:
В отличие от фиксированных единиц (секунды, минуты, часы), месяцы и годы зависят от календаря.
Это делает результат более «человеческим», но требует осторожности при строгих вычислениях.
| Интервал | formatDistanceStrict | formatDistance |
|---|---|---|
| 59 сек | 59 seconds | less than a minute |
| 61 сек | 1 minute | about 1 minute |
| 119 сек | 1 minute | about 2 minutes |
| 23 ч | 23 hours | about 1 day |
| 25 ч | 1 day | about 1 day |
Попытка использовать функцию для «разговорных» интерфейсов приводит к слишком сухим формулировкам.
Предположение, что 30 дней всегда равны месяцу, приводит к несоответствиям.
Функция не форматирует абсолютные даты, только интервалы.
При минимальных значениях:
formatDistanceStrict(new Date(), new Date());
Результат:
"0 seconds"
Если интервал менее одной секунды, округление зависит от
roundingMethod.
formatDistanceStrict строится на трёх принципах:
Это делает её подходящей для систем, где важна формальная точность отображения времени без языковой неопределённости.