В Day.js работа с днями недели строится вокруг двух подходов:
базового метода day() и расширения через плагин
weekday. Оба варианта решают одну задачу — получение и
изменение дня недели, но делают это по-разному и подходят для разных
сценариев.
day()Метод day() возвращает или устанавливает день недели в
диапазоне от 0 до 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 меняет логику индексации дней недели так,
чтобы неделя начиналась с понедельника.
Подключение:
import dayjs from 'dayjs';
import weekday from 'dayjs/plugin/weekday';
dayjs.extend(weekday);
Метод weekday() работает иначе, чем
day():
Получение дня недели:
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());
Пример интерпретации:
Метод также поддерживает установку значения:
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()));