В работе с календарными данными кварталы используются как укрупнённая
единица временной агрегации, позволяющая группировать даты по
финансовым, аналитическим и отчётным периодам. В экосистеме date-fns
операции с кварталами реализованы как набор чистых функций, не
изменяющих исходные объекты Date, что обеспечивает
предсказуемость и удобство композиции.
Квартал в стандартной модели календаря определяется как трёхмесячный интервал:
Базовая особенность реализации заключается в том, что все вычисления
опираются на локальное время экземпляра Date, без скрытых
преобразований состояния.
getQuarterФункция определения квартала возвращает число от 1 до 4, соответствующее текущему кварталу даты.
import { getQuarter } from 'date-fns'
getQuarter(new Date(2024, 0, 15)) // 1
getQuarter(new Date(2024, 4, 10)) // 2
getQuarter(new Date(2024, 8, 1)) // 3
getQuarter(new Date(2024, 11, 31)) // 4
Внутренняя логика основана на делении номера месяца:
quarter = Math.floor(month / 3) + 1
где month — значение от 0 до 11.
startOfQuarterФункция возвращает дату, приведённую к первому моменту первого дня квартала.
import { startOfQuarter } from 'date-fns'
startOfQuarter(new Date(2024, 5, 20))
// 2024-04-01T00:00:00.000
00:00:00.000Для месяца m:
startMonth = Math.floor(m / 3) * 3
endOfQuarterФункция возвращает последнюю миллисекунду последнего дня квартала.
import { endOfQuarter } from 'date-fns'
endOfQuarter(new Date(2024, 5, 20))
// 2024-06-30T23:59:59.999
addQuarters и subQuartersОперации смещения по кварталам реализуют сдвиг на 3 месяца за единицу.
import { addQuarters } from 'date-fns'
addQuarters(new Date(2024, 0, 10), 1)
// 2024-04-10
Добавление нескольких кварталов:
addQuarters(new Date(2024, 0, 10), 3)
// 2024-10-10
import { subQuarters } from 'date-fns'
subQuarters(new Date(2024, 6, 15), 1)
// 2024-03-15
differenceInQuartersФункция вычисляет целое количество кварталов между двумя датами.
import { differenceInQuarters } from 'date-fns'
differenceInQuarters(
new Date(2024, 9, 1),
new Date(2024, 0, 1)
) // 3
Формально:
diff = (monthA - monthB) / 3
setQuarterФункция изменяет квартал даты, сохраняя день внутри допустимого диапазона месяца.
import { setQuarter } from 'date-fns'
setQuarter(new Date(2024, 0, 15), 3)
// 2024-07-15
Квартальные операции автоматически учитывают смену года:
addQuarters(new Date(2024, 10, 10), 1)
// 2025-02-10
При работе с датами 29–31 числа возможна коррекция:
addQuarters(new Date(2024, 0, 31), 1)
// 2024-04-30
Причина — отсутствие 31 числа в апреле.
Квартальная группировка часто применяется в аналитических задачах.
import { getQuarter } from 'date-fns'
function getQuarterKey(date) {
return `${date.getFullYear()}-Q${getQuarter(date)}`
}
Результаты:
2024-Q12024-Q22024-Q3const grouped = dates.reduce((acc, date) => {
const key = `${date.getFullYear()}-Q${getQuarter(date)}`
acc[key] = acc[key] || []
acc[key].push(date)
return acc
}, {})
Квартальные операции часто используются в финансовой отчётности:
import { startOfQuarter, endOfQuarter } from 'date-fns'
function getReportingWindow(date) {
return {
from: startOfQuarter(date),
to: endOfQuarter(date)
}
}
Квартальные операции часто комбинируются с:
startOfYear, endOfYearaddMonths, subMonthsformatisWithinIntervalimport { isWithinInterval, startOfQuarter, endOfQuarter } from 'date-fns'
function filterByQuarter(dates, date) {
const interval = {
start: startOfQuarter(date),
end: endOfQuarter(date)
}
return dates.filter(d => isWithinInterval(d, interval))
}
Функции кварталов в date-fns построены на следующих принципах:
Date без внешних
зависимостейКаждая операция имеет сложность O(1) и не зависит от
размера данных, что делает их пригодными для высоконагруженных
вычислений временных рядов.