Работа с временными интервалами в date-fns строится вокруг принципа
неизменяемости и композиции функций. Интервалы представляют собой
диапазоны между двумя датами, где каждая операция над диапазоном
возвращает новый результат без модификации исходных данных. Одной из
базовых операций разбиения интервала на дискретные значения является
eachDayOfInterval.
Функция eachDayOfInterval формирует последовательность
дат, покрывающих весь указанный диапазон с шагом в один день. Интервал
задаётся двумя границами: начальной и конечной датой. Результатом
становится массив объектов Date, включающий каждую
календарную дату внутри диапазона.
eachDayOfInterval({ start, end })
Функция принимает объект с двумя обязательными свойствами:
Начальная дата интервала.
Конечная дата интервала.
Обе границы интервала включаются в результат, что является важным поведенческим отличием от некоторых других подходов к работе с диапазонами.
Алгоритм построен на последовательном увеличении даты от
start до end с шагом в один календарный день.
При этом учитывается календарная арифметика, а не фиксированное
количество миллисекунд, что позволяет корректно обрабатывать переходы
через месяцы и годы.
import { eachDayOfInterval } from 'date-fns';
const result = eachDayOfInterval({
start: new Date(2026, 0, 1),
end: new Date(2026, 0, 5),
});
console.log(result);
Результат:
[
2026-01-01,
2026-01-02,
2026-01-03,
2026-01-04,
2026-01-05
]
Каждый элемент массива представляет отдельный календарный день.
Особенность функции заключается в включении обеих границ:
Это поведение важно учитывать при расчётах длины интервала.
Если начальная дата больше конечной, поведение становится некорректным с точки зрения логики интервала. В таких случаях предварительная нормализация диапазона является обязательной.
Пример нормализации:
const interval = {
start: new Date(2026, 0, 10),
end: new Date(2026, 0, 1),
};
Корректная обработка требует перестановки границ перед вызовом функции.
import { eachDayOfInterval, endOfMonth } from 'date-fns';
const start = new Date(2026, 0, 1);
const end = endOfMonth(start);
const days = eachDayOfInterval({ start, end });
Такой подход позволяет формировать полный календарь месяца без ручного вычисления количества дней.
Последовательность, возвращаемая функцией, часто используется для построения календарных интерфейсов, где требуется линейное представление дат.
Типичная структура данных:
После получения массива дат часто применяется фильтрация по условиям.
import { eachDayOfInterval, isWeekend } from 'date-fns';
const days = eachDayOfInterval({
start: new Date(2026, 0, 1),
end: new Date(2026, 0, 31),
});
const weekdays = days.filter(date => !isWeekend(date));
При моделировании рабочих графиков функция используется как базовый генератор временной оси. Далее на неё накладываются правила:
eachDayOfInterval работает с объектами
Date, где календарная часть определяется локальной
временной зоной среды выполнения. Это означает:
Для серверных приложений это особенно важно при унификации времени хранения и отображения.
Функция корректно обрабатывает:
Пример:
eachDayOfInterval({
start: new Date(2024, 11, 30),
end: new Date(2025, 0, 2),
});
Результат охватывает непрерывную последовательность без пропусков.
Каждый следующий элемент вычисляется как:
Это отличается от прибавления фиксированного количества миллисекунд, поскольку учитывает календарные переходы.
Используется для подготовки оси времени в аналитике:
Позволяет формировать список дат для пакетных запросов:
Формирование структуры дней для UI:
При передаче некорректных значений Date возможны:
Invalid Date в результатеЕсли start и end совпадают, результат
содержит один элемент.
В рамках построения сложных интервалов часто используется комбинация с другими инструментами:
addDays — ручное смещение датdifferenceInDays — вычисление длины интервалаstartOfDay — нормализация времениendOfDay — фиксация границы сутокКомпозиция этих функций позволяет строить сложные календарные модели поверх базового разбиения.
При работе с длинными интервалами (несколько лет) важно учитывать:
Стандартная реализация возвращает полный массив, что подходит для ограниченных диапазонов и UI-задач, но требует осторожности в аналитических системах с большими данными.