Установка квартала

Работа с кварталами в Moment.js основана на стандартной календарной логике: год делится на четыре периода по три месяца, и каждому периоду соответствует значение от 1 до 4. Квартальная модель используется в финансовых расчётах, аналитике, отчётности и планировании временных интервалов.

Квартал определяется как часть года:

  • 1 квартал: январь — март
  • 2 квартал: апрель — июнь
  • 3 квартал: июль — сентябрь
  • 4 квартал: октябрь — декабрь

Внутри Moment.js квартал является производной от месяца: январь соответствует 1 кварталу, декабрь — 4 кварталу.

Получение квартала из даты

Для получения текущего квартала используется метод quarter():

moment().quarter()

Возвращаемое значение — число от 1 до 4.

Примеры:

moment('2026-01-15').quarter() // 1
moment('2026-05-10').quarter() // 2
moment('2026-08-01').quarter() // 3
moment('2026-11-30').quarter() // 4

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

Установка квартала

Метод quarter(value) позволяет задать квартал для существующего объекта даты:

moment().quarter(2)

Установка квартала изменяет месяц внутри текущего года так, чтобы дата оказалась внутри соответствующего диапазона:

moment('2026-01-15').quarter(3).format('YYYY-MM-DD')

Результат будет находиться в диапазоне третьего квартала (июль–сентябрь), при этом день месяца сохраняется, если он валиден для нового месяца.

Поведение при установке:

  • изменение месяца происходит автоматически
  • год остаётся без изменений
  • день корректируется при необходимости (например, 31 число может быть уменьшено до 30 или 28)

Границы квартала

Для получения начала и конца квартала используется метод startOf() и endOf() с аргументом 'quarter'.

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

moment('2026-05-10').startOf('quarter')

Результат:

  • дата устанавливается на первый день первого месяца квартала
  • время сбрасывается к 00:00:00.000

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

moment('2026-05-10').endOf('quarter')

Результат:

  • дата устанавливается на последний момент последнего дня квартала
  • время устанавливается к 23:59:59.999

Квартальные границы вычисляются строго на основе календарной структуры года.

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

Moment.js поддерживает специальные токены форматирования для отображения квартала:

  • Q — номер квартала (1–4)
  • Qo — порядковый формат (1st, 2nd, 3rd, 4th)

Примеры:

moment('2026-02-10').format('Q')
// 1

moment('2026-02-10').format('Qo')
// 1st

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

moment('2026-08-15').format('YYYY [Q]Q')
// 2026 Q3

Изменение квартала в цепочках операций

Квартал часто используется в цепочках преобразований даты:

moment()
  .quarter(4)
  .startOf('quarter')
  .format('YYYY-MM-DD')

В таких выражениях порядок операций имеет значение: сначала устанавливается квартал, затем вычисляются его границы.

Взаимосвязь квартала с месяцами

Каждый квартал охватывает строго три месяца:

  • квартал 1 → месяцы 0–2 (внутреннее представление Moment.js)
  • квартал 2 → месяцы 3–5
  • квартал 3 → месяцы 6–8
  • квартал 4 → месяцы 9–11

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

месяц = (квартал - 1) * 3

Эта логика используется как при чтении, так и при записи значения квартала.

Использование кварталов в расчётах

Кварталы применяются для группировки дат:

const dates = [
  '2026-01-10',
  '2026-03-22',
  '2026-07-05',
  '2026-11-19'
]

const grouped = dates.reduce((acc, d) => {
  const q = moment(d).quarter()
  acc[q] = acc[q] || []
  acc[q].push(d)
  return acc
}, {})

Результатом становится структура, распределяющая значения по кварталам года.

Сравнение кварталов

Кварталы можно использовать для логического сравнения периодов:

moment('2026-04-01').quarter() > moment('2026-02-01').quarter()

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

Работа с кварталом и границами периода

Комбинация методов позволяет строить отчётные периоды:

const start = moment().quarter(2).startOf('quarter')
const end = moment().quarter(2).endOf('quarter')

В результате формируется полный диапазон дат второго квартала текущего года.

Поведение при изменении года

При изменении года через year() квартал пересчитывается автоматически:

moment('2025-12-15')
  .year(2026)
  .quarter()

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

Особенности внутренней логики

Квартал не хранится как отдельное поле даты. Он вычисляется динамически на основе месяца. Это означает:

  • любое изменение месяца влияет на квартал
  • квартал всегда производен, а не первичен
  • операции с кварталом транслируются в операции с месяцем