Квартал и неделя года

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

Подключение выполняется явно:

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

dayjs.extend(quarterOfYear)

После подключения становится доступен метод определения квартала:

dayjs('2026-05-22').quarter() // 2

Кварталы в Day.js нумеруются с 1 до 4:

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

Определение квартала основывается на месяце даты, при этом логика не зависит от локали.

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

Метод quarter() может использоваться не только для чтения, но и для изменения даты:

dayjs('2026-05-22').quarter(1) // перевод в 1 квартал (январь 2026)

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

dayjs('2026-05-31').quarter(2) 
// апрель–июнь; дата будет скорректирована, если апрель не имеет 31 дня

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

Работа с границами квартала осуществляется через startOf и endOf:

dayjs('2026-05-22').startOf('quarter') // 2026-04-01 00:00:00
dayjs('2026-05-22').endOf('quarter')   // 2026-06-30 23:59:59.999

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

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

Для вывода квартала используется токен Q:

dayjs('2026-05-22').format('Q') // "2"

В сложных шаблонах форматирования квартал может комбинироваться с годом:

dayjs('2026-05-22').format('YYYY [Q]Q') // "2026 Q2"

Неделя года

Работа с неделями требует более тонкой настройки, поскольку существует несколько систем нумерации недель: стандартная (локальная) и ISO.

В Day.js поддержка недель реализуется через два основных плагина:

  • weekOfYear — локальная нумерация недель
  • isoWeek — ISO 8601 стандарт

Локальная неделя года

Подключение:

import weekOfYear from 'dayjs/plugin/weekOfYear'
dayjs.extend(weekOfYear)

После этого становится доступен метод:

dayjs('2026-01-01').week() // номер недели

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

ISO недели

ISO-нумерация строго определяет:

  • неделя начинается с понедельника
  • первая неделя года — та, которая содержит первый четверг года

Подключение:

import isoWeek from 'dayjs/plugin/isoWeek'
dayjs.extend(isoWeek)

Использование:

dayjs('2026-01-01').isoWeek() // ISO-неделя

Дополнительно доступны методы:

dayjs('2026-01-01').startOf('isoWeek')
dayjs('2026-01-01').endOf('isoWeek')

Различие week и isoWeek

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

Тип недели Начало недели Первая неделя года
week зависит от локали локальное правило
isoWeek понедельник неделя с первым четвергом

Это различие приводит к тому, что одна и та же дата может принадлежать разным неделям в разных системах:

dayjs('2026-01-01').week()     // например, 0 или 1
dayjs('2026-01-01').isoWeek()  // может быть 53 предыдущего года или 1

Установка недели

Обе системы поддерживают изменение недели:

dayjs('2026-05-22').week(10)
dayjs('2026-05-22').isoWeek(10)

При установке недели происходит пересчёт даты относительно начала соответствующей системы.

Границы недели

Получение начала и конца недели:

dayjs('2026-05-22').startOf('week')
dayjs('2026-05-22').endOf('week')

Для ISO:

dayjs('2026-05-22').startOf('isoWeek')
dayjs('2026-05-22').endOf('isoWeek')

Возвращаемые значения критически важны для построения недельных отчётов, таймлайнов и календарных сеток.

Неделя года и форматирование

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

const weekNumber = dayjs('2026-05-22').isoWeek()

Далее значение может быть встроено в строку вручную:

`2026-W${weekNumber}`

Особенности вычислений

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

  • переходы между годами (декабрь ↔︎ январь)
  • локальные настройки начала недели
  • различия между ISO и локальными правилами
  • корректировку дат при изменении периода

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