Библиотека date-fns предоставляет набор чистых функций для работы с
датами без мутаций объектов Date, что делает её
предсказуемой и удобной для функционального стиля программирования.
Одним из наиболее часто используемых блоков функций являются операции
сравнения и вычисления разницы между датами, где ключевую роль играет
семейство differenceIn*, включая
differenceInWeeks.
Функция differenceInWeeks возвращает количество полных
календарных недель между двумя датами.
differenceInWeeks(dateLeft, dateRight, [options])
dateLeft — конечная датаdateRight — начальная датаoptions — дополнительные настройки (например,
округление)Разница вычисляется по календарным неделям, а не по фиксированным
7×24 часам в строгом смысле. Это означает, что результат зависит от
границ недель и локали (если используется опция
weekStartsOn).
import { differenceInWeeks } from 'date-fns';
const result = differenceInWeeks(
new Date(2026, 0, 1),
new Date(2025, 11, 1)
);
console.log(result); // 4
Функция differenceInDays вычисляет количество полных
календарных дней между датами.
import { differenceInDays } from 'date-fns';
differenceInDays(
new Date(2026, 0, 10),
new Date(2026, 0, 1)
); // 9
Date)Функция differenceInMonths возвращает количество полных
календарных месяцев между датами.
import { differenceInMonths } from 'date-fns';
differenceInMonths(
new Date(2026, 6, 1),
new Date(2026, 0, 1)
); // 6
Если день месяца не совпадает, остаток не учитывается:
differenceInMonths(
new Date(2026, 1, 28),
new Date(2026, 0, 31)
); // 0
Функция differenceInYears аналогична месячной логике, но
на уровне лет.
import { differenceInYears } from 'date-fns';
differenceInYears(
new Date(2030, 0, 1),
new Date(2026, 0, 1)
); // 4
Эти функции работают на уровне временных единиц, ближе к абсолютной разнице.
import { differenceInHours } from 'date-fns';
differenceInHours(
new Date(2026, 0, 1, 12),
new Date(2026, 0, 1, 0)
); // 12
import { differenceInMinutes } from 'date-fns';
differenceInMinutes(
new Date(2026, 0, 1, 0, 30),
new Date(2026, 0, 1, 0, 0)
); // 30
import { differenceInSeconds } from 'date-fns';
differenceInSeconds(
new Date(2026, 0, 1, 0, 0, 10),
new Date(2026, 0, 1, 0, 0, 0)
); // 10
Наиболее низкоуровневая функция из серии.
import { differenceInMilliseconds } from 'date-fns';
differenceInMilliseconds(
new Date(2026, 0, 1, 0, 0, 0, 500),
new Date(2026, 0, 1, 0, 0, 0, 0)
); // 500
Используется при измерении производительности, таймингов, задержек.
Отличается от differenceInWeeks более строгим
календарным подходом.
import { differenceInCalendarWeeks } from 'date-fns';
differenceInCalendarWeeks(
new Date(2026, 0, 15),
new Date(2026, 0, 1)
);
differenceInWeeks может учитывать правила округления и
начало неделиdifferenceInCalendarWeeks ориентируется на календарные
переходы недельimport { differenceInQuarters } from 'date-fns';
differenceInQuarters(
new Date(2026, 9, 1),
new Date(2026, 0, 1)
); // 3
Применяется в финансовых и аналитических системах, где отчётность ведётся по кварталам.
К ним относятся:
differenceInWeeksdifferenceInMonthsdifferenceInYearsdifferenceInQuartersdifferenceInCalendarWeeksХарактеристика:
differenceInHoursdifferenceInMinutesdifferenceInSecondsdifferenceInMillisecondsХарактеристика:
Все функции семейства differenceIn* возвращают
отрицательные значения, если dateLeft раньше
dateRight.
differenceInDays(
new Date(2026, 0, 1),
new Date(2026, 0, 10)
); // -9
Несмотря на то что объекты Date в JavaScript хранят
время в UTC, вычисления в date-fns выполняются на основе
локального представления даты.
Это приводит к важным последствиям:
milliseconds, seconds)
менее подвержены влияниюimport {
differenceInDays,
differenceInHours,
differenceInMinutes
} from 'date-fns';
const start = new Date(2026, 0, 1, 10, 0);
const end = new Date(2026, 0, 3, 12, 30);
differenceInDays(end, start); // 2
differenceInHours(end, start); // 50
differenceInMinutes(end, start); // 3030
differenceInMonthsdifferenceInQuartersdifferenceInYearsdifferenceInDaysdifferenceInWeeksdifferenceInSecondsdifferenceInMillisecondsdifferenceInCalendarWeeksdifferenceInDaysВо всех differenceIn* функциях применяется усечение
(truncation), а не математическое округление.
Пример:
differenceInHours(
new Date(2026, 0, 1, 1, 59),
new Date(2026, 0, 1, 0, 0)
); // 1
Даже при 1 часе 59 минутах результат равен 1 часу.
Функции differenceIn* часто комбинируются с:
addDays, addWeeks,
addMonthsstartOfDay, startOfWeekisBefore, isAfterformatПример связки:
import { differenceInDays, startOfDay } from 'date-fns';
differenceInDays(
startOfDay(new Date(2026, 0, 10)),
startOfDay(new Date(2026, 0, 1))
);
Функции построены на следующих принципах:
Это обеспечивает предсказуемость поведения при работе с датами в сложных приложениях.