Работа с кварталами в date-fns строится вокруг двух ключевых операций: определение начала квартала и вычисление его конца. Квартал рассматривается как фиксированный интервал из трёх месяцев, привязанный к календарному году, где границы определяются исключительно датой входного значения без учёта времени суток, если не задано иное поведение окружения.
Календарный год делится на четыре квартала:
Каждый квартал имеет строго фиксированные границы по месяцам, но переменную длину по дням (от 90 до 92 дней в зависимости от года).
Внутри вычислений важно понимать, что квартал определяется не относительно недели или произвольного периода, а исключительно через номер месяца:
Функция startOfQuarter возвращает дату, приведённую к
первому моменту первого дня квартала, к которому относится исходная
дата.
Основная сигнатура:
import { startOfQuarter } from "date-fns";
startOfQuarter(date);
При передаче даты выполняется:
import { startOfQuarter } from "date-fns";
const date = new Date(2026, 5, 18); // 18 июня 2026
const result = startOfQuarter(date);
console.log(result);
// 2026-04-01T00:00:00.000Z (или локальный эквивалент)
Для июня (месяц 5) определяется второй квартал:
Функция endOfQuarter возвращает последний момент
последнего дня квартала, включая миллисекунды дня.
Сигнатура:
import { endOfQuarter } from "date-fns";
endOfQuarter(date);
Алгоритм включает:
import { endOfQuarter } from "date-fns";
const date = new Date(2026, 5, 18); // июнь 2026
const result = endOfQuarter(date);
console.log(result);
// 2026-06-30T23:59:59.999Z (или локальный эквивалент)
Обе функции используют одинаковую базовую модель вычисления:
Получение месяца из даты
Вычисление индекса квартала:
Math.floor(month / 3)Преобразование в границы:
quarterIndex * 3(quarterIndex * 3) + 2Для даты 2026-11-10:
Math.floor(10 / 3) = 3Операции с кварталами применяются в сценариях, где требуется агрегирование данных по финансовым или аналитическим периодам.
import { startOfQuarter, endOfQuarter } from "date-fns";
function getQuarterRange(date) {
return {
start: startOfQuarter(date),
end: endOfQuarter(date),
};
}
const range = getQuarterRange(new Date(2026, 10, 3));
console.log(range.start);
console.log(range.end);
import { startOfQuarter, endOfQuarter } from "date-fns";
const transactions = [
{ id: 1, date: new Date(2026, 3, 10) },
{ id: 2, date: new Date(2026, 6, 5) },
{ id: 3, date: new Date(2026, 4, 20) },
];
const referenceDate = new Date(2026, 4, 1);
const start = startOfQuarter(referenceDate);
const end = endOfQuarter(referenceDate);
const filtered = transactions.filter(t =>
t.date >= start && t.date <= end
);
Функции оперируют объектом Date, что приводит к важным
нюансам:
локальная временная зона влияет на результат форматирования
при сериализации в UTC возможен сдвиг даты
время всегда нормализуется:
Если дата находится на границе квартала:
startOfQuarter(new Date(2026, 3, 1));
endOfQuarter(new Date(2026, 2, 31));
обе функции корректно возвращают один и тот же квартал.
endOfQuarter(new Date(2026, 11, 15));
возвращает 31 декабря текущего года с максимальным временем дня.
Операции с кварталами логически связаны с:
Это обеспечивает единый подход к календарной арифметике, где квартал выступает промежуточным уровнем между месяцем и годом.
Любая дата внутри одного и того же квартала всегда даёт одинаковый результат:
startOfQuarter(new Date(2026, 3, 1)) === startOfQuarter(new Date(2026, 5, 30))
Результат одинаков, так как входная дата влияет только на выбор квартала, но не на его границы.
import { startOfQuarter, format } from "date-fns";
const date = new Date(2026, 7, 12);
const start = startOfQuarter(date);
console.log(format(start, "yyyy-MM-dd HH:mm:ss"));
Такой подход используется для унифицированного отображения отчетных периодов в интерфейсах и логах.