Работа с датами в JavaScript без специализированных инструментов быстро приводит к усложнению кода: вычисление порядкового номера дня в году требует учета високосных лет, различной длины месяцев и особенностей календаря. Библиотека Day.js решает эту задачу через расширяемый набор плагинов, среди которых предусмотрена поддержка получения дня года.
День года (day of year, DOY) — это число от 1 до 365 (или 366 в високосный год), показывающее порядковый номер даты в рамках текущего календарного года. Например, 1 января — это 1-й день года, 31 декабря — 365-й или 366-й.
В базовой поставке Day.js отсутствует метод для работы с порядковым
номером дня года. Для этого используется плагин
dayOfYear.
Подключение выполняется в несколько шагов:
import dayjs from 'dayjs'
import dayOfYear from 'dayjs/plugin/dayOfYear'
dayjs.extend(dayOfYear)
После расширения экземпляра становится доступен метод
dayOfYear().
Основной метод работы с порядковым номером дня:
dayjs().dayOfYear()
Возвращаемое значение — целое число.
Пример:
import dayjs from 'dayjs'
import dayOfYear from 'dayjs/plugin/dayOfYear'
dayjs.extend(dayOfYear)
const today = dayjs()
console.log(today.dayOfYear())
Результат зависит от текущей даты. Например, если сегодня 10 марта в невисокосный год, результат будет 69.
Метод применяется не только к текущей дате, но и к любому объекту Day.js:
const date = dayjs('2026-05-23')
console.log(date.dayOfYear())
Это позволяет вычислять позицию даты в рамках года для аналитики, календарных вычислений и построения временных шкал.
Метод dayOfYear также поддерживает запись значения,
изменяя дату:
const date = dayjs('2026-01-01')
const updated = date.dayOfYear(100)
console.log(updated.format('YYYY-MM-DD'))
В этом случае дата изменится так, чтобы соответствовать 100-му дню года.
При работе с порядковым номером дня года учитываются:
Високосный год определяется по стандартному правилу:
Это влияет на диапазон значений: 366 возможен только в високосные годы.
dayjs('2026-01-01').dayOfYear() // 1
dayjs('2026-07-01').dayOfYear() // 182 (в невисокосный год)
dayjs('2026-12-31').dayOfYear() // 365
Порядковый день года часто используется в задачах временного анализа:
Пример группировки данных:
const data = [
{ date: '2026-01-01', value: 10 },
{ date: '2026-01-02', value: 15 },
{ date: '2026-02-01', value: 7 }
]
const grouped = data.reduce((acc, item) => {
const doy = dayjs(item.date).dayOfYear()
acc[doy] = (acc[doy] || 0) + item.value
return acc
}, {})
console.log(grouped)
Иногда требуется быстро сравнить позиции дат в пределах одного года без учета времени:
const a = dayjs('2026-03-10').dayOfYear()
const b = dayjs('2026-05-01').dayOfYear()
console.log(a < b)
Такой подход упрощает сортировку дат в рамках одного календарного года.
Метод dayOfYear() работает строго в рамках конкретного
года объекта. При переходе между годами логика не переносится
автоматически.
dayjs('2025-12-31').dayOfYear() // 365
dayjs('2026-01-01').dayOfYear() // 1
Это важно при вычислении разницы между датами, охватывающими границу
года. В таких случаях требуется дополнительная обработка через
diff():
dayjs('2026-01-01').diff(dayjs('2025-12-31'), 'day') // 1
Параметр установки позволяет восстанавливать дату из номера дня года:
const date = dayjs('2026-01-01').dayOfYear(256)
console.log(date.format('YYYY-MM-DD'))
Это удобно при работе с порядковыми календарями, где дата представлена только числом дня в году.
Несмотря на удобство, использование дня года имеет ограничения:
Для точных временных вычислений рекомендуется комбинировать
dayOfYear() с другими методами Day.js:
startOf('year')diff()format()const start = dayjs().startOf('year')
const current = dayjs()
const diff = current.diff(start, 'day') + 1
console.log(diff === current.dayOfYear())
Это демонстрирует эквивалентность двух подходов к вычислению дня года.
Порядковый день года часто используется в:
Пример временной шкалы:
const events = [
{ name: 'start', date: '2026-01-10' },
{ name: 'checkpoint', date: '2026-06-15' },
{ name: 'end', date: '2026-12-20' }
]
events.forEach(e => {
const d = dayjs(e.date)
console.log(e.name, d.dayOfYear())
})
const dates = [
'2026-02-01',
'2026-02-15',
'2026-03-01'
]
const sorted = dates
.map(d => dayjs(d))
.sort((a, b) => a.dayOfYear() - b.dayOfYear())
console.log(sorted.map(d => d.format('YYYY-MM-DD')))
const year = dayjs('2024-01-01')
const maxDay = year.isLeapYear ? 366 : 365
console.log(maxDay)
В сочетании с dayOfYear() это позволяет валидировать
диапазоны значений при пользовательском вводе или импорте данных.
Метод dayOfYear() в Day.js представляет собой компактный
инструмент для перехода от календарной даты к линейной временной шкале
внутри года и обратно. Он интегрируется в более широкую систему работы с
датами, сохраняя предсказуемость и согласованность вычислений при
условии корректной обработки границ года и календарных особенностей.