Квартал в календарном представлении представляет собой фиксированный трехмесячный интервал, используемый при финансовых расчетах, отчетности и временной агрегации данных. В библиотеке Date-fns работа с кварталами реализована через операции с календарными единицами, где квартал трактуется как строго 3 месяца, начиная с текущей позиции даты.
Основной набор функций включает добавление и вычитание кварталов, что позволяет изменять дату с сохранением календарной структуры без ручного пересчета месяцев.
Квартал определяется как:
При вычислениях используется календарная арифметика, а не фиксированное количество дней. Это означает, что переход между кварталами учитывает различную длину месяцев (28–31 день), а также високосные годы.
Для увеличения даты на определенное количество кварталов используется
функция addQuarters.
Сигнатура:
addQuarters(date, amount)
Где:
date — исходная датаamount — количество кварталов для добавленияФункция возвращает новый объект Date, не изменяя
исходную дату, что соответствует принципу неизменяемости.
import { addQuarters } from 'date-fns';
const date = new Date(2024, 0, 15); // 15 января 2024
const result = addQuarters(date, 1);
// 15 апреля 2024
Добавление одного квартала эквивалентно увеличению месяца на 3.
import { addQuarters } from 'date-fns';
const date = new Date(2024, 2, 10); // 10 марта 2024
const result = addQuarters(date, 2);
// 10 сентября 2024
Здесь происходит переход через два календарных квартала: март → июнь → сентябрь.
При добавлении кварталов сохраняется день месяца, если это возможно. В ситуациях, когда целевой месяц имеет меньше дней, происходит корректировка:
import { addQuarters } from 'date-fns';
const date = new Date(2024, 0, 31); // 31 января
const result = addQuarters(date, 1);
// 30 апреля (или 1 мая в зависимости от пересчета календаря)
Такое поведение связано с тем, что апрель имеет 30 дней.
Операция обратного смещения реализуется функцией
subQuarters.
Сигнатура:
subQuarters(date, amount)
Где:
date — исходная датаamount — количество кварталов для вычитанияimport { subQuarters } from 'date-fns';
const date = new Date(2024, 9, 20); // 20 октября 2024
const result = subQuarters(date, 1);
// 20 июля 2024
import { subQuarters } from 'date-fns';
const date = new Date(2024, 11, 1); // 1 декабря 2024
const result = subQuarters(date, 3);
// 1 марта 2024
Происходит последовательное смещение назад по трехмесячным интервалам.
Обе функции работают на основе календарной модели:
Это отличает квартальные операции от низкоуровневых арифметических вычислений с таймстампами.
Кварталы традиционно распределяются следующим образом:
При добавлении кварталов переход происходит между этими блоками, однако сама функция не оперирует понятием «Q1–Q4», а работает через смещение месяцев.
import { addQuarters } from 'date-fns';
const date = new Date(2024, 11, 31); // 31 декабря 2024
const result = addQuarters(date, 1);
// март 2025 (дата корректируется внутри месяца)
Квартальные операции часто используются совместно с другими функциями:
import { addQuarters, addDays } from 'date-fns';
const base = new Date(2024, 0, 1);
const result = addDays(addQuarters(base, 1), 10);
Сначала происходит смещение на квартал, затем добавляются дни.
import { subQuarters, startOfMonth } from 'date-fns';
const date = new Date(2024, 6, 15);
const result = startOfMonth(subQuarters(date, 2));
Сначала дата смещается назад на два квартала, затем нормализуется к началу месяца.
Операции добавления и вычитания кварталов не модифицируют исходную дату. Это позволяет безопасно использовать их в цепочках преобразований и функциональных композициях.
const original = new Date(2024, 3, 10);
const shifted = addQuarters(original, 2);
original === shifted; // false
Квартальные смещения используются при:
Так как квартал основан на месяцах, високосный год влияет только на длину февраля:
const date = new Date(2024, 0, 31);
const result = addQuarters(date, 1);
Февраль 2024 содержит 29 дней, что влияет на итоговую корректировку при переносе дат на конец месяца.
Хотя основная логика разделена на add/sub функции, передача
отрицательных значений в addQuarters приводит к эквиваленту
вычитания и наоборот:
addQuarters(date, -1); // эквивалент subQuarters(date, 1)
Однако для читаемости кода обычно используется явная форма.
Квартальные операции часто становятся частью последовательных преобразований даты:
import { addQuarters, setDate } from 'date-fns';
const date = new Date(2024, 0, 1);
const result = setDate(addQuarters(date, 1), 15);
Сначала дата переносится на следующий квартал, затем устанавливается конкретный день месяца.
Квартальные операции работают на уровне локального времени объекта
Date. Это означает: