День недели и день года

В Day.js работа с днями недели строится вокруг двух подходов: базового метода day() и расширения через плагин weekday. Оба варианта решают одну задачу — получение и изменение дня недели, но делают это по-разному и подходят для разных сценариев.

Базовый метод day()

Метод day() возвращает или устанавливает день недели в диапазоне от 0 до 6, где:

  • 0 — воскресенье
  • 1 — понедельник
  • 2 — вторник
  • 3 — среда
  • 4 — четверг
  • 5 — пятница
  • 6 — суббота

Получение текущего дня недели:

import dayjs from 'dayjs';

const now = dayjs();
const weekday = now.day();

console.log(weekday);

Установка конкретного дня недели:

const date = dayjs('2026-05-22');

const changed = date.day(0); // установить воскресенье

console.log(changed.format('YYYY-MM-DD'));

Поведение метода важно учитывать: при установке нового дня Weekday изменяется в пределах текущей недели относительно исходной даты. Это означает, что Day.js не просто заменяет число, а пересчитывает дату.

Пример смещения:

const date = dayjs('2026-05-22'); // пятница

const result = date.day(1); // понедельник той же недели

console.log(result.format('YYYY-MM-DD'));

Особенности индексации

Стандартная модель day() основана на американской неделе, где неделя начинается с воскресенья. Это может создавать неудобства в локализациях, где неделя начинается с понедельника.

Для таких случаев используется плагин weekday.


Плагин weekday

Плагин weekday меняет логику индексации дней недели так, чтобы неделя начиналась с понедельника.

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

import dayjs from 'dayjs';
import weekday from 'dayjs/plugin/weekday';

dayjs.extend(weekday);

Метод weekday() работает иначе, чем day():

  • 0 — понедельник
  • 1 — вторник
  • 2 — среда
  • 3 — четверг
  • 4 — пятница
  • 5 — суббота
  • 6 — воскресенье

Получение дня недели:

const date = dayjs('2026-05-22');

console.log(date.weekday());

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

const date = dayjs('2026-05-22');

const result = date.weekday(0); // понедельник

console.log(result.format('YYYY-MM-DD'));

Сравнение day() и weekday()

Ключевое различие заключается в системе отсчёта:

Метод Начало недели Диапазон
day() воскресенье 0–6
weekday() понедельник 0–6

Использование weekday() особенно удобно в бизнес-логике, календарях, планировщиках и системах задач, где неделя традиционно начинается с понедельника.


Работа с началом недели

С помощью weekday() удобно вычислять начало недели:

const date = dayjs('2026-05-22');

const monday = date.weekday(0);
const sunday = date.weekday(6);

console.log(monday.format('YYYY-MM-DD'));
console.log(sunday.format('YYYY-MM-DD'));

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


День года

День года — это порядковый номер дня в пределах календарного года, начиная с 1 января. В Day.js эта функциональность реализуется через плагин dayOfYear.

Подключение плагина

import dayjs from 'dayjs';
import dayOfYear from 'dayjs/plugin/dayOfYear';

dayjs.extend(dayOfYear);

Получение дня года

Метод dayOfYear() возвращает число от 1 до 365 (или 366 в високосный год):

const date = dayjs('2026-05-22');

console.log(date.dayOfYear());

Пример интерпретации:

  • 1 января → 1
  • 31 декабря → 365 (или 366)

Установка дня года

Метод также поддерживает установку значения:

const date = dayjs('2026-01-01');

const result = date.dayOfYear(150);

console.log(result.format('YYYY-MM-DD'));

Day.js пересчитывает дату, смещая её относительно начала года.


Работа с границами года

При использовании dayOfYear() важно учитывать переход между годами:

const date = dayjs('2026-01-01');

const result = date.dayOfYear(400);

console.log(result.format('YYYY-MM-DD'));

Если значение превышает количество дней в году, библиотека автоматически переносит дату в следующий год.

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

const date = dayjs('2026-01-01');

const result = date.dayOfYear(-10);

console.log(result.format('YYYY-MM-DD'));

Практическое применение дня года

1. Прогресс года

const now = dayjs();
const progress = now.dayOfYear();

console.log(`День года: ${progress}`);

2. Процент выполнения года

const now = dayjs();
const isLeap = now.isLeapYear ? 366 : 365;

const percent = (now.dayOfYear() / isLeap) * 100;

console.log(percent.toFixed(2));

3. Планирование по годовым циклам

function getAnnualCheckpoint(dayNumber) {
  return dayjs().startOf('year').dayOfYear(dayNumber);
}

console.log(getAnnualCheckpoint(100).format('YYYY-MM-DD'));

Связь с началом года

Метод dayOfYear() тесно связан с startOf('year'), который позволяет получать точку отсчёта:

const start = dayjs().startOf('year');
const day50 = start.add(49, 'day');

console.log(day50.format('YYYY-MM-DD'));

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


Особенности високосного года

В високосные годы появляется 29 февраля, что влияет на расчёт дня года:

const date = dayjs('2024-03-01');

console.log(date.dayOfYear());

Разница становится заметной при сравнении одинаковых дат в разных годах, поэтому при аналитике временных рядов важно учитывать isLeapYear().


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

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

const date = dayjs('2026-05-22');

const info = {
  weekday: date.weekday(),
  dayOfYear: date.dayOfYear()
};

console.log(info);

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


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

const startOfYear = dayjs().startOf('year');

const weeks = [];

for (let i = 0; i < 52; i++) {
  weeks.push(startOfYear.add(i * 7, 'day'));
}

console.log(weeks.map(w => w.format('YYYY-MM-DD')));

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


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

const dates = [
  dayjs('2026-01-10'),
  dayjs('2026-05-22'),
  dayjs('2026-12-31')
];

const filtered = dates.filter(d => d.dayOfYear() > 100);

console.log(filtered.map(d => d.format('YYYY-MM-DD')));

Сопоставление с календарными системами

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

  • порядковые циклы года
  • недельные шаблоны
  • повторяющиеся события
function getCalendarKey(date) {
  return `${date.dayOfYear()}-${date.weekday()}`;
}

console.log(getCalendarKey(dayjs()));