В библиотеке date-fns вычисление разницы между датами
реализовано через набор специализированных функций, каждая из которых
работает на определённой временной единице. Для анализа интервалов
используются функции differenceInDays,
differenceInHours, differenceInMinutes, а
также более общая логика, основанная на вычислении абсолютной разницы
между временными метками.
Основной принцип работы всех функций разницы заключается в сравнении
двух значений типа Date и возвращении количества полных
единиц времени между ними. При этом результат всегда целочисленный,
поскольку дробные части отбрасываются.
Каждая функция принимает два аргумента:
differenceInX(dateLeft, dateRight)
dateLeft — конечная датаdateRight — начальная датаРезультат вычисляется как:
dateLeft - dateRight → количество временных единиц
При этом важно учитывать порядок: если dateRight больше
dateLeft, результат будет отрицательным.
Функция differenceInDays возвращает количество полных
календарных дней между двумя датами.
import { differenceInDays } from 'date-fns';
differenceInDays(dateLeft, dateRight);
Функция вычисляет разницу в миллисекундах и преобразует её в дни, учитывая границы суток.
const result = differenceInDays(
new Date('2024-01-10'),
new Date('2024-01-01')
);
console.log(result); // 9
differenceInDays(
new Date('2024-01-02T23:59:00'),
new Date('2024-01-01T00:01:00')
);
Результат:
1
Несмотря на почти 48 часов разницы, считается только один полный день.
Функция differenceInHours возвращает количество полных
часов между датами.
import { differenceInHours } from 'date-fns';
differenceInHours(dateLeft, dateRight);
Разница сначала вычисляется в миллисекундах, затем переводится в часы с отбрасыванием дробной части.
const result = differenceInHours(
new Date('2024-01-01T12:00:00'),
new Date('2024-01-01T00:00:00')
);
console.log(result); // 12
differenceInHours(
new Date('2024-01-01T12:59:59'),
new Date('2024-01-01T00:00:00')
);
Результат:
12
Одна минута до 13 часов не учитывается.
Функция differenceInMinutes используется для наиболее
детализированного измерения из рассматриваемых трёх уровней.
import { differenceInMinutes } from 'date-fns';
differenceInMinutes(dateLeft, dateRight);
Разница вычисляется в миллисекундах и преобразуется в минуты:
const result = differenceInMinutes(
new Date('2024-01-01T00:10:00'),
new Date('2024-01-01T00:00:00')
);
console.log(result); // 10
differenceInMinutes(
new Date('2024-01-01T00:10:59'),
new Date('2024-01-01T00:00:00')
);
Результат:
10
Секунды полностью игнорируются при округлении вниз.
Поведение функций можно систематизировать по уровню точности:
differenceInDays — календарные суткиdifferenceInHours — 24-часовые блокиdifferenceInMinutes — 60-минутные интервалыВсе функции основаны на одной концепции: преобразование разницы в миллисекундах в целевую единицу с последующим усечением результата.
Порядок аргументов напрямую влияет на знак результата:
differenceInHours(
new Date('2024-01-02T00:00:00'),
new Date('2024-01-01T00:00:00')
); // 24
Обратный порядок:
differenceInHours(
new Date('2024-01-01T00:00:00'),
new Date('2024-01-02T00:00:00')
); // -24
Это поведение сохраняется для всех функций разницы.
В практических сценариях часто используются ISO-строки:
import { differenceInDays, parseISO } from 'date-fns';
differenceInDays(
parseISO('2024-06-10'),
parseISO('2024-06-01')
);
Использование parseISO обеспечивает корректное
преобразование строки в объект Date, что снижает риск
ошибок при работе с временными зонами и форматами.
Во всех функциях date-fns применяется усечение
результата (truncation), а не математическое округление.
Пример:
differenceInHours(
new Date('2024-01-01T01:59:59'),
new Date('2024-01-01T00:00:00')
);
Результат:
1
Даже при значении почти в 2 часа возвращается 1.
При работе с датами в JavaScript важно учитывать поведение временных
зон. date-fns опирается на встроенный объект
Date, поэтому:
Пример ситуации DST:
differenceInDays всё равно вернёт 1, если прошёл
календарный деньФункции разницы применяются в задачах:
Каждая единица измерения выбирается исходя из требуемой точности: