В Luxon работа с неделями строится вокруг ISO-8601 стандарта, где неделя:
Ключевые свойства объекта DateTime:
import { DateTime } from "luxon";
const dt = DateTime.local(2026, 1, 24);
dt.weekNumber; // например: 4
dt.weekYear; // например: 2026
dt.weekday; // 6 (суббота)
Важно учитывать: weekYear может отличаться от
календарного года, если дата находится на границе декабря и января.
Для операций с недельными интервалами чаще всего используются методы нормализации даты к границам недели.
const start = dt.startOf("week");
Результат — дата, приведённая к понедельнику 00:00:00 текущей недели.
const end = dt.endOf("week");
Результат — воскресенье 23:59:59.999 текущей недели.
Эти методы учитывают локаль, но при стандартной конфигурации Luxon опирается на ISO-неделю.
Luxon предоставляет арифметику через plus и
minus, где недели задаются как единица измерения.
const nextWeek = dt.plus({ weeks: 1 });
const previousWeek = dt.minus({ weeks: 2 });
При таком смещении:
Особенность: переход через границы года автоматически корректирует
weekYear.
Для вычисления разницы используется метод diff.
const a = DateTime.local(2026, 1, 1);
const b = DateTime.local(2026, 2, 1);
const diff = b.diff(a, "weeks").weeks;
Результат — дробное число недель, отражающее точную разницу во времени.
При необходимости округления:
Math.floor(diff);
или
Math.round(diff);
Luxon позволяет строить дату напрямую из параметров недельной системы.
const dt = DateTime.fromObject({
weekYear: 2026,
weekNumber: 10,
weekday: 1
});
Такой способ полезен при работе с:
Если weekday не указан, по умолчанию используется
понедельник.
Изменение компонентов недели выполняется через set.
const upd ated = dt.se t({
weekNumber: 12,
weekYear: 2026
});
При этом важно:
weekNumber и weekYear должны быть
согласованыТакже можно менять день недели:
const moved = dt.set({ weekday: 5 });
Частая задача — проход по диапазону недель.
let current = DateTime.local(2026, 1, 1).startOf("week");
const end = DateTime.local(2026, 3, 1);
while (current < end) {
// работа с неделей
console.log(current.weekNumber, current.weekYear);
current = current.plus({ weeks: 1 });
}
Такой подход сохраняет стабильную недельную сетку независимо от длины месяцев.
Luxon поддерживает ISO-представления, полезные для отчётности и логирования.
dt.toFormat("kkkk-'W'WW");
Где:
kkkk — weekYearWW — номер недели с ведущим нулёмПример: 2026-W04
dt.toISOWeekDate();
Формат: YYYY-Www-D Пример: 2026-W04-6
Работа с неделями требует учёта переходных зон:
const dt = DateTime.local(2026, 1, 1);
dt.weekYear; // может быть 2025
dt.weekNumber; // 52 или 53
Это связано с тем, что первая неделя года — это неделя, содержащая первый четверг января.
Хотя ISO-норма фиксирует понедельник как начало недели, Luxon позволяет учитывать локаль:
const dt = DateTime.local().setLocale("en");
Однако большинство недельных операций (weekNumber, weekYear) остаются
ISO-ориентированными, а локаль влияет в основном на форматирование и
startOf('week').
Практическая работа часто включает цепочки преобразований:
const rangeStart = DateTime.local(2026, 1, 1)
.startOf("week");
const rangeEnd = rangeStart
.plus({ weeks: 8 })
.endOf("week");
Или получение начала следующей недели с нормализацией времени:
const nextWeekStart = dt
.startOf("week")
.plus({ weeks: 1 });
Для проверки принадлежности к одной неделе достаточно сравнить
weekNumber и weekYear:
function isSameWeek(a, b) {
return a.weekNumber === b.weekNumber && a.weekYear === b.weekYear;
}
Для более строгого контроля можно сравнивать начало недели:
a.startOf("week").equals(b.startOf("week"));
Недельная модель Luxon особенно полезна при:
Типичный шаблон агрегации:
const grouped = {};
dates.forEach(d => {
const key = `${d.weekYear}-W${d.weekNumber}`;
grouped[key] = (grouped[key] || 0) + 1;
});
Так формируется структура данных, независимая от месячной логики.