Квартал

Квартал в Luxon рассматривается как производная календарная единица, основанная на делении года на четыре равные части по три месяца. В рамках библиотеки Luxon кварталы реализованы как часть календарной модели DateTime и используются для группировки дат, вычисления диапазонов и построения временной логики уровня бизнес-аналитики.

Календарный квартал — это фиксированный интервал:

  • I квартал: январь — март
  • II квартал: апрель — июнь
  • III квартал: июль — сентябрь
  • IV квартал: октябрь — декабрь

В Luxon квартал вычисляется исключительно на основе месяца, без учёта внешних финансовых или кастомных календарей.

Определение квартала через DateTime

Основной способ получения квартала — использование свойства quarter у объекта DateTime.

import { DateTime } from "luxon";

const dt = DateTime.local(2026, 5, 23);
dt.quarter; // 2

Логика вычисления проста: месяц преобразуется в номер квартала по формуле:

  • 1–3 → 1
  • 4–6 → 2
  • 7–9 → 3
  • 10–12 → 4

Форматирование квартала

Luxon поддерживает форматирование квартала через токен q.

DateTime.local(2026, 5, 23).toFormat("q"); // "2"

При необходимости можно комбинировать с другими календарными токенами:

DateTime.local(2026, 5, 23).toFormat("yyyy 'Q' q"); // "2026 Q 2"

Особенность заключается в том, что q возвращает номер квартала без ведущих символов и без локализационных преобразований.

Начало и конец квартала

Для работы с диапазонами Luxon предоставляет методы startOf и endOf.

Начало квартала

DateTime.local(2026, 5, 23)
  .startOf("quarter")

Результат:

  • 2026-04-01 00:00:00

Конец квартала

DateTime.local(2026, 5, 23)
  .endOf("quarter")

Результат:

  • 2026-06-30 23:59:59.999

Эти методы опираются на внутреннюю календарную модель и учитывают длину месяцев, включая високосные годы.

Арифметика кварталов

Luxon позволяет выполнять смещения по кварталам через метод plus и minus, используя объектную форму длительности.

const dt = DateTime.local(2026, 1, 15);

dt.plus({ quarters: 1 });
// 2026-04-15
dt.minus({ quarters: 2 });
// 2025-07-15

При добавлении кварталов происходит эквивалентное добавление трёх месяцев за один шаг, с автоматической нормализацией дат.

Кварталы и переходы через год

При пересечении границы года сохраняется корректная календарная логика:

DateTime.local(2026, 11, 10)
  .plus({ quarters: 1 });

Результат:

  • 2027-02-10

Здесь происходит переход из IV квартала текущего года в I квартал следующего.

Определение границ квартала через Interval

Квартал часто используется для построения временных интервалов. Luxon позволяет комбинировать startOf и endOf для создания диапазонов:

const start = DateTime.local().startOf("quarter");
const end = DateTime.local().endOf("quarter");

const interval = start.until(end);

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

Работа с календарной структурой

Квартал тесно связан с другими единицами:

  • месяцами (month)
  • неделями (week)
  • годом (year)

При вызове startOf('quarter') происходит каскадная нормализация:

  • день → 1
  • время → 00:00:00.000
  • месяц → первый месяц квартала

Квартал и локализация

В Luxon квартал не зависит от локали. Независимо от настроек языка или региона:

  • структура кварталов остаётся фиксированной
  • границы всегда соответствуют григорианскому календарю

Это важно для систем, где требуется стабильная временная модель, например в аналитике и логировании.

Особенности использования quarter в DateTime

Свойство quarter:

  • является вычисляемым, а не хранимым
  • всегда синхронизировано с month
  • не требует дополнительных вызовов методов
const dt = DateTime.local(2026, 12, 31);

dt.quarter; // 4
dt.month;   // 12

Любое изменение месяца автоматически меняет квартал при пересчёте объекта.

Кварталы и преобразование дат

При создании DateTime через fromObject квартал напрямую не задаётся, но может быть использован косвенно через месяц:

DateTime.fromObject({
  year: 2026,
  month: 8
});

Здесь квартал определяется автоматически как III.

Практика вычисления диапазонов квартала

Типичный шаблон работы с кварталом включает три шага:

const dt = DateTime.local();

const quarterStart = dt.startOf("quarter");
const quarterEnd = dt.endOf("quarter");
const quarterNumber = dt.quarter;

Эта комбинация используется для построения отчётных периодов и временных срезов.

Квартальная логика в вычислениях

При построении бизнес-логики кварталы часто используются в агрегатных функциях:

  • суммирование данных по периодам
  • сравнение квартал к кварталу
  • разбиение временных рядов

Luxon обеспечивает стабильную основу для таких операций через строгую календарную модель без скрытых смещений или округлений.