Номер квартала

Квартал — это календарный интервал, представляющий собой одну из четырёх частей года. В Day.js работа с кварталами реализуется через отдельный плагин и набор встроенных методов форматирования и вычисления дат. Каждый квартал охватывает три месяца:

  • Q1: январь — март
  • Q2: апрель — июнь
  • Q3: июль — сентябрь
  • Q4: октябрь — декабрь

Day.js не включает функциональность кварталов в базовую сборку, поэтому требуется подключение плагина.


Подключение поддержки кварталов

Для работы с номером квартала используется плагин quarterOfYear.

import dayjs from 'dayjs';
import quarterOfYear from 'dayjs/plugin/quarterOfYear';

dayjs.extend(quarterOfYear);

После расширения экземпляры Day.js получают доступ к методу quarter().


Получение номера квартала

Метод quarter() возвращает номер квартала текущей даты.

dayjs('2026-01-15').quarter(); // 1
dayjs('2026-05-10').quarter(); // 2
dayjs('2026-11-01').quarter(); // 4

Логика определения квартала основана на месяце:

  • Январь (0) — март (2) → 1 квартал
  • Апрель (3) — июнь (5) → 2 квартал
  • Июль (6) — сентябрь (8) → 3 квартал
  • Октябрь (9) — декабрь (11) → 4 квартал

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

Метод quarter() также работает как сеттер, позволяя изменить дату, установив конкретный квартал.

dayjs('2026-01-15').quarter(3).format(); 
// 2026-07-15T00:00:00Z (или локальное время)

При установке квартала Day.js автоматически пересчитывает месяц, сохраняя день, если это возможно. В случае переполнения даты происходит корректировка.


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

Day.js поддерживает токен Q для вывода номера квартала через форматирование.

dayjs('2026-02-10').format('Q'); // "1"
dayjs('2026-08-10').format('Q'); // "3"

Часто используется комбинированное форматирование:

dayjs('2026-08-10').format('[Q]Q YYYY');
// Q3 2026

Квадратные скобки фиксируют буквальный вывод символов.


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

Для работы с границами квартала используются методы startOf и endOf.

dayjs('2026-05-20').startOf('quarter').format();
// 2026-04-01T00:00:00Z

dayjs('2026-05-20').endOf('quarter').format();
// 2026-06-30T23:59:59Z

Эти операции полезны для:

  • построения отчётных периодов
  • агрегации данных
  • фильтрации записей по временным диапазонам

Алгоритм определения квартала

Внутренняя логика Day.js базируется на целочисленном делении номера месяца:

quarter = Math.floor(month / 3) + 1

Где month — значение от 0 до 11.

Пример:

  • март (2): Math.floor(2 / 3) + 1 = 1
  • июнь (5): Math.floor(5 / 3) + 1 = 2
  • декабрь (11): Math.floor(11 / 3) + 1 = 4

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

При установке квартала Day.js вычисляет первый месяц соответствующего периода:

dayjs().quarter(2);

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


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

Кварталы часто применяются при аналитической обработке данных:

const dates = [
  dayjs('2026-01-10'),
  dayjs('2026-02-15'),
  dayjs('2026-07-20'),
];

const grouped = {};

dates.forEach(date => {
  const q = date.year() + '-Q' + date.quarter();
  if (!grouped[q]) grouped[q] = [];
  grouped[q].push(date.format('YYYY-MM-DD'));
});

Результат группирует даты по кварталам одного года.


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

Day.js не предоставляет специального типа сравнения кварталов, но его легко реализовать через комбинацию года и квартала:

const a = dayjs('2026-02-10');
const b = dayjs('2026-05-10');

const sameQuarter = a.year() === b.year() && a.quarter() === b.quarter();

Квартал и границы времени

Методы startOf('quarter') и endOf('quarter') учитывают временную точность:

  • начало: 00:00:00.000
  • конец: 23:59:59.999 (или эквивалентная максимальная точность)

Это важно при работе с базами данных и API, где диапазоны дат должны быть строго определены.


Кварталы в форматировании отчётов

Комбинация года и квартала часто используется для бизнес-логики:

function formatQuarter(date) {
  return `Q${date.quarter()} ${date.year()}`;
}

formatQuarter(dayjs('2026-09-12')); // Q3 2026

Особенности работы в разных сценариях

  • Квартал всегда зависит от календарного года
  • Переключение квартала не меняет год автоматически
  • При переходе через границы года quarter() сохраняет корректную привязку
  • Day.js не учитывает финансовые кварталы, отличающиеся от календарных

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

Часто встречаются следующие проблемы:

  • использование format('Q') без подключения плагина
  • попытка использовать квартал как встроенный метод без extend
  • путаница между индексом месяца (0–11) и кварталом (1–4)
  • игнорирование влияния startOf('quarter') на время суток

Использование кварталов в фильтрации данных

const filterByQuarter = (list, year, quarter) => {
  return list.filter(item => {
    const d = dayjs(item.date);
    return d.year() === year && d.quarter() === quarter;
  });
};

Такой подход применяется при обработке больших массивов временных записей.


Оптимизация вычислений квартала

Поскольку вычисление квартала основано на простом делении, операции quarter() являются дешёвыми и не требуют дополнительной памяти или сложных преобразований. Это делает их подходящими для массовой обработки дат в циклах и потоках данных.