Day.js предоставляет компактный и предсказуемый API для операций с календарными датами, включая манипуляции днями и неделями. Основной принцип заключается в неизменяемости объектов: каждая операция возвращает новый экземпляр даты, не изменяя исходный.
Работа с днями строится вокруг методов add,
subtract, startOf, endOf и
доступа к компонентам даты через day().
Операции смещения даты выполняются через единый интерфейс:
import dayjs from "dayjs";
const now = dayjs();
const tomorrow = now.add(1, "day");
const yesterday = now.subtract(1, "day");
Ключевой момент: второй аргумент задаёт единицу измерения. Помимо
"day" поддерживаются "week",
"month", "year" и другие.
При добавлении дней учитываются календарные переходы:
dayjs("2024-01-31").add(1, "day"); // 2024-02-01
Для нормализации дат часто требуется приведение к границам суток.
const date = dayjs("2024-06-15 14:35:20");
const start = date.startOf("day");
const end = date.endOf("day");
Результаты:
startOf("day") → 00:00:00.000endOf("day") → 23:59:59.999Такая нормализация используется при фильтрации записей по диапазону дат.
День недели доступен через метод day():
const date = dayjs("2024-06-15");
date.day(); // число от 0 до 6
Значения по умолчанию:
Изменение дня недели:
dayjs("2024-06-15").day(1); // установить понедельник текущей недели
Важно: изменение дня недели не меняет неделю как сущность, а пересчитывает дату внутри текущего календарного окна.
Работа с неделями требует различать стандартные недели и ISO-недели, так как они используют разные правила начала недели.
Метод startOf("week") и endOf("week")
зависят от локали. В большинстве конфигураций неделя начинается в
воскресенье.
const date = dayjs("2024-06-15");
const weekStart = date.startOf("week");
const weekEnd = date.endOf("week");
Это поведение может изменяться через локализацию, где неделя начинается с понедельника.
ISO-8601 определяет неделю как начинающуюся с понедельника. Для
работы с таким форматом используется плагин isoWeek.
import dayjs from "dayjs";
import isoWeek from "dayjs/plugin/isoWeek";
dayjs.extend(isoWeek);
После подключения доступны методы:
isoWeek()isoWeekday()startOf("isoWeek")endOf("isoWeek")dayjs("2024-01-10").isoWeek(); // номер недели в году
ISO-неделя учитывает правило:
Это приводит к тому, что первые дни января могут относиться к последней неделе предыдущего года.
dayjs("2024-06-15").isoWeekday();
Значения:
Изменение дня недели:
dayjs("2024-06-15").isoWeekday(1);
Для стандартного номера недели используется плагин
weekOfYear.
import weekOfYear from "dayjs/plugin/weekOfYear";
dayjs.extend(weekOfYear);
После этого доступен метод:
dayjs("2024-06-15").week();
Различие между week() и isoWeek()
заключается в правилах календаря и локали.
dayjs("2024-06-15").startOf("week");
dayjs("2024-06-15").endOf("week");
dayjs("2024-06-15").startOf("isoWeek");
dayjs("2024-06-15").endOf("isoWeek");
Использование ISO-недель особенно важно в бизнес-логике, где отчётность строится по календарным неделям, а не локальным настройкам.
Недели поддерживают арифметику аналогично дням:
const date = dayjs("2024-06-15");
const nextWeek = date.add(1, "week");
const prevWeek = date.subtract(1, "week");
Смещение эквивалентно добавлению 7 дней, но сохраняет семантическую читаемость кода.
Частый сценарий — получение диапазона недели для выборки данных.
const date = dayjs("2024-06-15");
const range = {
start: date.startOf("isoWeek"),
end: date.endOf("isoWeek")
};
Такой подход используется при:
Локаль влияет на:
startOf("week")Например, в некоторых локалях неделя начинается с понедельника, что сближает стандартную неделю с ISO-неделей, но не делает их идентичными.
Система API включает несколько уровней работы с днями:
day() — абсолютный день недели (0–6)weekday() — локализованный индекс дня недели (плагин
weekday)isoWeekday() — ISO-индекс (1–7)Плагин weekday:
import weekday from "dayjs/plugin/weekday";
dayjs.extend(weekday);
Использование:
dayjs().weekday(0); // первый день недели согласно локали
const start = dayjs().startOf("month").startOf("week");
const days = Array.from({ length: 42 }, (_, i) =>
start.add(i, "day")
);
const weekKey = dayjs(date).startOf("isoWeek").format("YYYY-MM-DD");
const date = dayjs("2024-06-15");
const target = dayjs("2024-06-12");
const inSameWeek =
date.startOf("isoWeek").isSame(target.startOf("isoWeek"));
Работа с неделями и днями требует учёта календарных переходов:
Пример перехода года:
dayjs("2020-12-31").isoWeek(); // может относиться к первой неделе следующего года
API позволяет строить последовательные трансформации:
dayjs()
.startOf("isoWeek")
.add(2, "day")
.endOf("day");
Такие цепочки используются для вычисления точных диапазонов внутри недели, например третьего рабочего дня.
a.isSame(b, "day");
a.isSame(b, "week");
a.isSame(b, "isoWeek");
Выбор единицы измерения определяет уровень гранулярности сравнения.
При построении календарной навигации часто используется шаг по неделям:
let current = dayjs();
current = current.subtract(1, "week");
current = current.add(2, "week");
Каждая операция сохраняет календарную целостность и учитывает длину месяцев и переходы между ними.
add, subtract,
day, startOf, endOf