Неделя в Luxon определяется не фиксированным алгоритмом, а сочетанием локали, календарных правил и контекста временной зоны. Это делает работу с границами недели гибкой, но требует понимания того, как именно библиотека интерпретирует начало и конец недельного интервала.
Основной инструмент для работы с недельными границами —
DateTime и методы startOf('week') и
endOf('week').
В Luxon неделя не является универсальной единицей с фиксированным
началом в понедельник. Поведение зависит от локали, установленной у
экземпляра DateTime.
en-US неделя начинается в
воскресеньеen-GB, ru, de
неделя начинается в понедельникЛокаль задаётся через:
import { DateTime } from "luxon";
const dt = DateTime.now().setLocale("en-GB");
или глобально через настройки (если используется конфигурация приложения).
Локаль влияет на то, как интерпретируются:
startOf('week')endOf('week')Метод startOf('week') возвращает дату и время,
соответствующие началу недели в текущей локали.
const dt = DateTime.fromISO("2026-05-23T15:30:00").setLocale("en-GB");
const start = dt.startOf("week");
Если локаль европейская (например, en-GB), результат
будет понедельник 00:00:00.000.
Пример:
DateTime.fromISO("2026-05-23").setLocale("en-GB").startOf("week").toISO();
Результат:
2026-05-18T00:00:00.000+03:00 (в зависимости от зоны)
Если локаль американская:
const dt = DateTime.fromISO("2026-05-23").setLocale("en-US");
dt.startOf("week");
Неделя начинается в воскресенье, и результат будет смещён на один день назад относительно европейской модели.
startOf('week') всегда:
DateTimeЭто делает метод удобным для построения диапазонов дат, фильтрации и агрегации.
Метод endOf('week') возвращает последний момент недели в
рамках локали.
const dt = DateTime.fromISO("2026-05-23").setLocale("en-GB");
const end = dt.endOf("week");
Результат соответствует воскресенью 23:59:59.999 (для европейских локалей).
Пример:
DateTime.fromISO("2026-05-23")
.setLocale("en-GB")
.endOf("week")
.toISO();
Типичный результат:
2026-05-24T23:59:59.999+03:00
Метод выполняет два шага:
Это делает его пригодным для:
Часто начало и конец недели используются вместе для построения интервала:
const dt = DateTime.fromISO("2026-05-23").setLocale("en-GB");
const start = dt.startOf("week");
const end = dt.endOf("week");
Получается замкнутый интервал:
Такой диапазон используется в SQL-подобных фильтрах:
const events = events.filter(e =>
DateTime.fromISO(e.date) >= start &&
DateTime.fromISO(e.date) <= end
);
Luxon поддерживает ISO-нумерацию недели через свойства:
weekNumberweekYearISO-неделя определяется по правилам:
const dt = DateTime.fromISO("2026-01-01");
dt.weekNumber;
dt.weekYear;
Важно различать:
startOf('week') — локальная логикаПрямого метода startOf('isoWeek') нет, поэтому границы
ISO-недели вычисляются через weekYear и
weekNumber:
const isoStart = DateTime.fromObject({
weekYear: dt.weekYear,
weekNumber: dt.weekNumber
}).startOf("week");
Такой подход нормализует дату к началу ISO-недели.
Неделя в Luxon всегда привязана к конкретной временной зоне объекта
DateTime.
const dt = DateTime.fromISO("2026-05-23T12:00:00", {
zone: "Europe/Moscow"
});
При изменении зоны:
Это критично при обработке данных из нескольких регионов.
DateTime.now().startOf("week")
Без явного setLocale результат может отличаться от
ожидаемого, особенно в системах, где дефолтная локаль —
американская.
Использование weekNumber для одной логики и
startOf('week') для другой приводит к несоответствиям
диапазонов.
Luxon-объекты нельзя корректно сравнивать без нормализации:
dt1 >= dt2 // некорректный подход
Правильный способ:
dt1.toMillis() >= dt2.toMillis()
Иногда требуется явное управление границами недели:
function getWeekRange(date) {
const dt = DateTime.fromISO(date).setLocale("en-GB");
return {
start: dt.startOf("week"),
end: dt.endOf("week")
};
}
Для ISO-логики:
function getISOWeekRange(date) {
const dt = DateTime.fromISO(date);
const monday = DateTime.fromObject({
weekYear: dt.weekYear,
weekNumber: dt.weekNumber
}).startOf("week");
return {
start: monday,
end: monday.endOf("week")
};
}
Недели часто пересекают границы года:
Luxon сохраняет целостность недельного интервала, не обрезая его по границам года.
DateTime.fromISO("2025-12-31").startOf("week");
Результат может относиться к неделе, начинающейся в декабре предыдущего года.
Неделя как временной интервал используется для:
Использование startOf('week') и
endOf('week') позволяет унифицировать временные диапазоны
без ручной арифметики дат и учёта календарных исключений