В библиотеке date-fns интервал времени представляется структурой
Interval, содержащей две даты: начало и конец. Базовая
форма:
const interval = {
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 10),
};
Корректная работа с интервалами предполагает соблюдение нескольких условий:
Интервалы используются в задачах фильтрации дат, проверки пересечений, планирования и вычисления временных диапазонов.
Перед работой с интервалами выполняется проверка валидности отдельных
дат. В date-fns для этого используется функция isValid.
import { isValid } from "date-fns";
isValid(new Date()); // true
isValid(new Date("invalid")); // false
Невалидные даты могут возникать при парсинге строк, арифметике дат или работе с внешними источниками данных. Любая некорректная дата внутри интервала делает его непригодным для дальнейших операций.
Типичная проверка интервала:
const isValidInterval = (interval) =>
isValid(interval.start) && isValid(interval.end);
Частая проблема — инвертированные границы, когда start
оказывается позже end. Для корректировки используется
сравнение дат.
import { compareAsc } from "date-fns";
const normalizeInterval = (interval) => {
const order = compareAsc(interval.start, interval.end);
if (order <= 0) {
return interval;
}
return {
start: interval.end,
end: interval.start,
};
};
Функция compareAsc возвращает:
-1, если первая дата раньше1, если позже0, если равныНормализация устраняет неоднозначность в логике дальнейших операций.
Для определения попадания точки во временной диапазон используется
isWithinInterval.
import { isWithinInterval } from "date-fns";
const interval = {
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 10),
};
isWithinInterval(new Date(2024, 0, 5), interval); // true
Логика проверки включает:
startendГраницы интервала считаются включительными.
Для анализа перекрытия временных диапазонов используется
areIntervalsOverlapping.
import { areIntervalsOverlapping } from "date-fns";
const intervalA = {
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 10),
};
const intervalB = {
start: new Date(2024, 0, 5),
end: new Date(2024, 0, 15),
};
areIntervalsOverlapping(intervalA, intervalB); // true
Условия пересечения:
Дополнительный параметр функции управляет включением границ:
areIntervalsOverlapping(intervalA, intervalB, { inclusive: false });
При inclusive: false касание границ не считается
пересечением.
Базовые операции сравнения дат используются при построении более сложной логики.
import { isBefore, isAfter } from "date-fns";
isBefore(new Date(2024, 0, 1), new Date(2024, 0, 2)); // true
isAfter(new Date(2024, 0, 2), new Date(2024, 0, 1)); // true
Эти функции применяются при:
Для точного сравнения используется isEqual.
import { isEqual } from "date-fns";
isEqual(
new Date(2024, 0, 1),
new Date(2024, 0, 1)
); // true
В контексте интервалов это важно для определения:
Интервал, в котором начало и конец совпадают, представляет отдельный случай:
const interval = {
start: new Date(2024, 0, 1),
end: new Date(2024, 0, 1),
};
Такой интервал:
Пограничные случаи возникают также при соприкосновении интервалов:
Практическая валидация обычно объединяет несколько правил:
import { isValid, compareAsc } from "date-fns";
const validateInterval = (interval) => {
if (!isValid(interval.start) || !isValid(interval.end)) {
return false;
}
if (compareAsc(interval.start, interval.end) === 1) {
return false;
}
return true;
};
Такая проверка обеспечивает:
Распространённые проблемы возникают при:
DateКаждая из этих ошибок приводит к некорректным результатам при фильтрации, сравнении и агрегации временных диапазонов