Генерация последовательностей дат в Date-fns основана на работе с интервалами и функциями, возвращающими массивы дат с заданной периодичностью. Библиотека предоставляет набор готовых утилит для построения временных рядов без ручной реализации циклов и сложной арифметики дат.
В Date-fns последовательности дат строятся вокруг структуры интервала:
{
start: Date,
end: Date
}
Интервал определяет границы временного диапазона, внутри которого формируется набор дат. Такой подход унифицирует работу функций генерации и позволяет применять единый API для разных временных масштабов.
Основной инструмент для ежедневных последовательностей —
eachDayOfInterval.
import { eachDayOfInterval } from 'date-fns';
const range = eachDayOfInterval({
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 7)
});
console.log(range);
Результатом становится массив:
[
2024-01-01,
2024-01-02,
2024-01-03,
2024-01-04,
2024-01-05,
2024-01-06,
2024-01-07
]
Функция учитывает календарные переходы автоматически, включая месяцы разной длины и високосные годы.
Для работы с неделями используется
eachWeekOfInterval.
import { eachWeekOfInterval } from 'date-fns';
const weeks = eachWeekOfInterval({
start: new Date(2024, 0, 1),
end: new Date(2024, 2, 1)
});
По умолчанию каждая неделя начинается с воскресенья (или локально
настроенного дня недели при использовании дополнительных опций через
startOfWeek).
Результат — массив дат, соответствующих началу каждой недели в интервале.
Для генерации по месяцам применяется
eachMonthOfInterval.
import { eachMonthOfInterval } from 'date-fns';
const months = eachMonthOfInterval({
start: new Date(2023, 0, 1),
end: new Date(2023, 11, 31)
});
Каждый элемент массива соответствует первому дню месяца внутри диапазона.
Использование характерно для:
Функция eachYearOfInterval формирует список годов:
import { eachYearOfInterval } from 'date-fns';
const years = eachYearOfInterval({
start: new Date(2018, 0, 1),
end: new Date(2024, 0, 1)
});
Возвращаемые значения нормализуются к 1 января каждого года.
Несмотря на наличие встроенных функций, часто требуется произвольный
шаг интервала. В таких случаях используется комбинация
addDays, addMonths и цикла.
import { addDays } from 'date-fns';
const start = new Date(2024, 0, 1);
const end = new Date(2024, 0, 15);
const result = [];
let current = start;
while (current <= end) {
result.push(current);
current = addDays(current, 3);
}
Подобный подход применяется для:
При работе с интервалами важно учитывать нормализацию начала и конца периода.
import { startOfDay, endOfDay } from 'date-fns';
const interval = {
start: startOfDay(new Date(2024, 0, 1)),
end: endOfDay(new Date(2024, 0, 7))
};
Это устраняет проблемы с временной компонентой и часовыми сдвигами при сравнении дат.
Сгенерированные массивы часто трансформируются с использованием
format.
import { eachDayOfInterval, format } from 'date-fns';
const days = eachDayOfInterval({
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 5)
});
const formatted = days.map(date =>
format(date, 'yyyy-MM-dd')
);
Форматирование используется для:
Последовательности дат часто фильтруются по условиям.
import { eachDayOfInterval, getDay } from 'date-fns';
const days = eachDayOfInterval({
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 31)
});
const weekdays = days.filter(date => {
const day = getDay(date);
return day !== 0 && day !== 6;
});
Так формируется набор рабочих дней без выходных.
Генерация последовательностей дат используется при построении календарей.
Алгоритм обычно включает:
import {
startOfMonth,
endOfMonth,
startOfWeek,
endOfWeek,
eachDayOfInterval
} from 'date-fns';
const monthStart = startOfMonth(new Date(2024, 0, 1));
const monthEnd = endOfMonth(monthStart);
const calendarStart = startOfWeek(monthStart);
const calendarEnd = endOfWeek(monthEnd);
const calendarDays = eachDayOfInterval({
start: calendarStart,
end: calendarEnd
});
Результат — полный набор дат для отрисовки сетки месяца.
Date-fns часто используется для подготовки данных под графики.
Пример генерации точек наблюдения:
import { eachDayOfInterval, format } from 'date-fns';
const data = eachDayOfInterval({
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 10)
}).map(date => ({
date: format(date, 'yyyy-MM-dd'),
value: Math.random()
}));
Такая структура применяется в аналитике и визуализации.
При генерации больших диапазонов важно учитывать:
Для диапазонов в десятки тысяч элементов предпочтительнее:
При пересечении часовых поясов могут возникать эффекты сдвига даты.
Date-fns оперирует объектами Date, поэтому корректность
зависит от локального окружения.
Типичная практика — нормализация через начало дня:
import { startOfDay, eachDayOfInterval } from 'date-fns';
const days = eachDayOfInterval({
start: startOfDay(new Date(2024, 0, 1)),
end: startOfDay(new Date(2024, 0, 10))
});
Часто используется комбинация генерации и агрегации:
eachDayOfIntervalimport { eachDayOfInterval, format } from 'date-fns';
const grouped = eachDayOfInterval({
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 31)
}).reduce((acc, date) => {
const key = format(date, 'yyyy-MM');
acc[key] = (acc[key] || 0) + 1;
return acc;
}, {});
Генерация последовательностей в Date-fns строится вокруг единого принципа:
Такой подход снижает необходимость ручного управления календарной логикой и делает работу с временными рядами предсказуемой и структурированной