Библиотека date-fns предоставляет набор функций
семейства differenceIn*, предназначенных для вычисления
разницы между двумя датами в различных единицах измерения времени. Все
функции принимают два аргумента: дату-«позднее» и дату-«раньше», и
возвращают целое число, отражающее количество полных единиц между
ними.
Общий принцип работы:
Date.Вычисляет разницу в миллисекундах без дополнительной нормализации.
import { differenceInMilliseconds } from 'date-fns';
const result = differenceInMilliseconds(
new Date('2024-01-02T00:00:00.000Z'),
new Date('2024-01-01T00:00:00.000Z')
);
// 86400000
Особенности:
Переводит разницу в секунды с отбрасыванием миллисекунд.
import { differenceInSeconds } from 'date-fns';
differenceInSeconds(
new Date('2024-01-01T00:00:10.500Z'),
new Date('2024-01-01T00:00:00.000Z')
);
// 10
Возвращает количество полных минут.
import { differenceInMinutes } from 'date-fns';
differenceInMinutes(
new Date('2024-01-01T00:05:00'),
new Date('2024-01-01T00:00:30')
);
// 4
Округление вниз происходит после перевода секунд в минуты.
Используется для вычисления разницы в часах.
import { differenceInHours } from 'date-fns';
differenceInHours(
new Date('2024-01-02T03:00:00'),
new Date('2024-01-01T00:00:00')
);
// 27
Возвращает количество полных суток между датами.
import { differenceInDays } from 'date-fns';
differenceInDays(
new Date('2024-01-10'),
new Date('2024-01-01')
);
// 9
Функция учитывает переходы через сутки, а не календарные границы.
Переводит разницу в недели (7-дневные интервалы).
import { differenceInWeeks } from 'date-fns';
differenceInWeeks(
new Date('2024-01-15'),
new Date('2024-01-01')
);
// 2
Вычисляет разницу в календарных месяцах без учёта дней внутри месяца.
import { differenceInMonths } from 'date-fns';
differenceInMonths(
new Date('2024-03-01'),
new Date('2024-01-31')
);
// 2
Механика основана на смещении месяца и года, а не на количестве дней.
Возвращает количество полных лет между датами.
import { differenceInYears } from 'date-fns';
differenceInYears(
new Date('2025-01-01'),
new Date('2020-01-01')
);
// 5
Квартальная разница (3 месяца на квартал).
import { differenceInQuarters } from 'date-fns';
differenceInQuarters(
new Date('2024-10-01'),
new Date('2024-01-01')
);
// 3
Календарные функции отличаются тем, что игнорируют «внутренние» единицы времени и сравнивают только календарные границы (дни, месяцы, годы).
Сравнение по календарным дням без учёта времени суток.
import { differenceInCalendarDays } from 'date-fns';
differenceInCalendarDays(
new Date('2024-01-02T23:59:59'),
new Date('2024-01-01T00:00:00')
);
// 1
Даже при почти двух сутках разница считается как 1 календарный день.
Сравнение по календарным месяцам.
import { differenceInCalendarMonths } from 'date-fns';
differenceInCalendarMonths(
new Date('2024-03-31'),
new Date('2024-01-01')
);
// 2
Счёт идёт по переходам месяца, а не по количеству дней.
Сравнение по годам.
import { differenceInCalendarYears } from 'date-fns';
differenceInCalendarYears(
new Date('2026-01-01'),
new Date('2024-12-31')
);
// 2
Разница по календарным неделям (с учётом начала недели по ISO/локали).
import { differenceInCalendarWeeks } from 'date-fns';
differenceInCalendarWeeks(
new Date('2024-01-15'),
new Date('2024-01-01')
);
// 2
Отдельная категория — рабочие дни, исключающие выходные.
import { differenceInBusinessDays } from 'date-fns';
differenceInBusinessDays(
new Date('2024-01-08'),
new Date('2024-01-01')
);
// 5
Особенности:
Первый аргумент — конечная дата, второй — начальная.
differenceInDays(dateA, dateB)
При обратном порядке результат отрицательный.
Все функции работают по принципу усечения:
Округление вверх не применяется.
date-fns опирается на объект Date и его
локальное/UTC представление, но не вводит собственной системы часовых
поясов. Разница вычисляется через timestamp.
Различие моделей вычисления:
differenceInDays,
differenceInHours) — работают через фиксированные интервалы
времени;differenceInCalendarDays,
differenceInCalendarMonths) — ориентируются на смену
календарных единиц.Пример расхождения:
differenceInDays(new Date('2024-03-01'), new Date('2024-02-28')) // 2
differenceInCalendarDays(new Date('2024-03-01'), new Date('2024-02-28')) // 2
Но при переходах через летнее время или нестандартные интервалы расхождения становятся заметнее.
const start = new Date();
// операция
const end = new Date();
differenceInMilliseconds(end, start);
differenceInHours(deadline, new Date());
differenceInYears(new Date(), birthDate);
differenceInCalendarMonths(endDate, startDate);
differenceInBusinessDays(endDate, startDate);
Если даты совпадают:
differenceInDays(date, date); // 0
Во всех вариантах результат равен нулю независимо от типа функции.