Создание интервалов

Интервалы в date-fns представляют собой базовую структуру для работы с временными диапазонами. В большинстве функций используется объект с двумя обязательными свойствами: началом и концом периода. Такая модель позволяет унифицировано описывать любые временные отрезки — от секунд до лет.

В библиотеке интервал задаётся простым объектом:

const interval = {
  start: new Date(2026, 0, 1),
  end: new Date(2026, 0, 10)
};

Ключевые требования к структуре:

  • start должен быть экземпляром Date
  • end должен быть экземпляром Date
  • логически start не должен быть позже end, хотя некоторые функции допускают обратный порядок

Такой подход делает интервалы совместимыми со всеми утилитами date-fns, работающими с диапазонами времени.

Создание интервалов вручную

Наиболее прямой способ формирования интервала — явное указание границ:

const interval = {
  start: new Date(2026, 4, 1),
  end: new Date(2026, 4, 15)
};

При ручном создании важно учитывать:

  • месяцы в JavaScript нумеруются с нуля
  • время по умолчанию устанавливается на 00:00:00
  • при необходимости границы уточняются через вспомогательные функции

Для стандартизации границ часто используются функции нормализации:

import { startOfDay, endOfDay } from 'date-fns';

const interval = {
  start: startOfDay(new Date(2026, 4, 1)),
  end: endOfDay(new Date(2026, 4, 15))
};

Интервалы через функции начала и конца периода

В date-fns предусмотрены функции, позволяющие формировать корректные границы временных единиц.

День

import { startOfDay, endOfDay } from 'date-fns';

const interval = {
  start: startOfDay(new Date()),
  end: endOfDay(new Date())
};

Неделя

import { startOfWeek, endOfWeek } from 'date-fns';

const interval = {
  start: startOfWeek(new Date()),
  end: endOfWeek(new Date())
};

Месяц

import { startOfMonth, endOfMonth } from 'date-fns';

const interval = {
  start: startOfMonth(new Date()),
  end: endOfMonth(new Date())
};

Год

import { startOfYear, endOfYear } from 'date-fns';

const interval = {
  start: startOfYear(new Date()),
  end: endOfYear(new Date())
};

Такой способ гарантирует корректные границы без необходимости ручной корректировки времени.

Построение интервалов через арифметику дат

Интервалы часто формируются динамически, на основе смещения дат.

import { addDays } from 'date-fns';

const start = new Date(2026, 0, 1);
const end = addDays(start, 10);

const interval = {
  start,
  end
};

Аналогично используются:

  • subDays
  • addMonths
  • subMonths
  • addYears
import { addMonths } from 'date-fns';

const interval = {
  start: new Date(2026, 0, 1),
  end: addMonths(new Date(2026, 0, 1), 3)
};

Такой подход удобен для построения скользящих окон времени.

Использование intervalToDuration для расчётов границ

Хотя intervalToDuration не создаёт интервал напрямую, она часто применяется при конструировании диапазонов на основе разницы дат.

import { intervalToDuration } from 'date-fns';

const duration = intervalToDuration({
  start: new Date(2026, 0, 1),
  end: new Date(2026, 3, 1)
});

Полученная структура может использоваться для вычисления новых границ интервала, например при нормализации пользовательского ввода.

Проверка корректности интервала

При создании интервалов важно контролировать порядок дат.

const isValidInterval = (interval) =>
  interval.start <= interval.end;

В date-fns многие функции предполагают корректный порядок, поэтому предварительная проверка снижает риск некорректных вычислений.

Нормализация интервалов

Интервалы могут быть приведены к единому виду через сравнение дат:

const normalizeInterval = (interval) => {
  return interval.start > interval.end
    ? { start: interval.end, end: interval.start }
    : interval;
};

Такой приём часто используется перед передачей интервала в функции библиотеки.

Объединение дат в интервалы из массива

При работе с наборами дат интервалы формируются динамически:

const dates = [
  new Date(2026, 0, 10),
  new Date(2026, 0, 15),
  new Date(2026, 0, 20)
];

const interval = {
  start: dates[0],
  end: dates[dates.length - 1]
};

Если данные не отсортированы, предварительно применяется сортировка:

import { compareAsc } from 'date-fns';

dates.sort(compareAsc);

Интервалы с плавающими границами

В некоторых сценариях границы интервала зависят от текущего времени:

import { subDays, addDays } from 'date-fns';

const now = new Date();

const interval = {
  start: subDays(now, 7),
  end: addDays(now, 7)
};

Такие интервалы часто используются для окон анализа данных или выборок.

Интервалы в сочетании с календарными функциями

Создание интервала часто комбинируется с функциями привязки к календарю:

import { startOfWeek, endOfWeek } from 'date-fns';

const interval = {
  start: startOfWeek(new Date(), { weekStartsOn: 1 }),
  end: endOfWeek(new Date(), { weekStartsOn: 1 })
};

Параметр weekStartsOn позволяет унифицировать поведение интервала в зависимости от локали или бизнес-логики.

Детерминированные интервалы

Для систем, где важна повторяемость расчётов, интервалы формируются от фиксированных точек:

const base = new Date(2026, 0, 1);

const interval = {
  start: base,
  end: new Date(base.getFullYear(), base.getMonth() + 1, base.getDate())
};

Такой подход часто применяется в отчётных системах и агрегациях.

Интервалы как основа временных выборок

После создания интервала он используется в других функциях date-fns, например:

  • проверка попадания даты в диапазон
  • вычисление пересечений
  • генерация списков дат внутри интервала

Пример структуры:

const interval = {
  start: new Date(2026, 0, 1),
  end: new Date(2026, 0, 31)
};

Такая модель становится базовой единицей для большинства операций над временем в библиотеке.