Номер недели — это порядковый номер недели внутри года. В большинстве стран и стандартов используется система ISO 8601, где:
1 до
52 или 53.В библиотеке Luxon работа с номером недели встроена в объект
DateTime и поддерживает как получение значения, так и
создание дат на основе номера недели.
weekNumberДля получения номера недели используется свойство
weekNumber.
import { DateTime } from "luxon";
const date = DateTime.local(2025, 3, 14);
console.log(date.weekNumber);
Результат:
11
Дата 14 марта 2025 относится к одиннадцатой ISO-неделе
года.
Luxon использует ISO-стандарт, поэтому:
const date = DateTime.local(2021, 1, 1);
console.log(date.weekNumber);
Результат:
53
1 января 2021 относится к 53-й неделе 2020 года по
ISO.
const date = DateTime.local(2020, 12, 31);
console.log(date.weekNumber);
Результат:
53
weekYearПри работе с номером недели почти всегда необходимо учитывать ISO-год
недели (weekYear).
Календарный год и ISO-год недели могут отличаться.
const date = DateTime.local(2021, 1, 1);
console.log(date.year);
console.log(date.weekYear);
console.log(date.weekNumber);
Результат:
2021
2020
53
Здесь:
2021;2020;53.weekdayДля полноценной работы с неделями используется свойство
weekday.
Нумерация дней:
| День | Значение |
|---|---|
| Понедельник | 1 |
| Вторник | 2 |
| Среда | 3 |
| Четверг | 4 |
| Пятница | 5 |
| Суббота | 6 |
| Воскресенье | 7 |
Пример:
const date = DateTime.local(2025, 3, 14);
console.log(date.weekday);
Результат:
5
Пятница.
Luxon позволяет создавать дату не только через год, месяц и день, но и через:
weekYearweekNumberweekdayconst date = DateTime.fromObject({
weekYear: 2025,
weekNumber: 20,
weekday: 1
});
console.log(date.toISODate());
Результат:
2025-05-12
Создан понедельник 20-й недели 2025 года.
startOf("week")const date = DateTime.local(2025, 3, 14);
const start = date.startOf("week");
console.log(start.toISODate());
Результат:
2025-03-10
endOf("week")const date = DateTime.local(2025, 3, 14);
const end = date.endOf("week");
console.log(end.toISO());
Результат:
2025-03-16T23:59:59.999
const nextWeek = DateTime.now().plus({ weeks: 1 });
console.log(nextWeek.weekNumber);
const prevWeek = DateTime.now().minus({ weeks: 1 });
console.log(prevWeek.weekNumber);
diffconst start = DateTime.local(2025, 1, 1);
const end = DateTime.local(2025, 2, 1);
const diff = end.diff(start, "weeks");
console.log(diff.toObject());
Результат:
{ weeks: 4.428571428571429 }
const weeks = Math.floor(
end.diff(start, "weeks").weeks
);
console.log(weeks);
Частая задача — сформировать массив дней текущей недели.
const now = DateTime.now();
const start = now.startOf("week");
const days = Array.from({ length: 7 }, (_, i) =>
start.plus({ days: i })
);
days.forEach(day => {
console.log(day.toISODate());
});
toFormatLuxon поддерживает специальные токены для ISO-недель.
| Токен | Значение |
|---|---|
W |
номер недели |
WW |
номер недели с ведущим нулём |
kkkk |
ISO-week-year |
const date = DateTime.local(2025, 3, 14);
console.log(
date.toFormat("kkkk-'W'WW")
);
Результат:
2025-W11
ISO допускает запись даты в формате:
YYYY-Www-D
Пример:
2025-W11-5
Где:
2025 — ISO-год;11 — номер недели;5 — пятница.const date = DateTime.fromObject({
weekYear: 2025,
weekNumber: 11,
weekday: 5
});
console.log(date.toISODate());
Результат:
2025-03-14
Номер недели ISO не зависит от локали:
const date = DateTime.now()
.setLocale("ru");
console.log(date.weekNumber);
Локаль влияет на форматирование текста, но не меняет ISO-алгоритм недель.
InfoДля получения локализованных названий дней применяется класс
Info.
import { Info } from "luxon";
console.log(
Info.weekdays("long", { locale: "ru" })
);
Результат:
[
'понедельник',
'вторник',
'среда',
'четверг',
'пятница',
'суббота',
'воскресенье'
]
Пример формирования структуры для календаря.
function getWeek(date) {
const start = date.startOf("week");
return Array.from({ length: 7 }, (_, i) => {
return start.plus({ days: i });
});
}
const week = getWeek(DateTime.now());
week.forEach(day => {
console.log({
date: day.toISODate(),
week: day.weekNumber,
weekday: day.weekday
});
});
function isSameWeek(a, b) {
return (
a.weekYear === b.weekYear &&
a.weekNumber === b.weekNumber
);
}
const d1 = DateTime.local(2025, 3, 10);
const d2 = DateTime.local(2025, 3, 14);
console.log(isSameWeek(d1, d2));
Результат:
true
const dates = [
DateTime.local(2025, 3, 14),
DateTime.local(2025, 1, 1),
DateTime.local(2025, 7, 20)
];
dates.sort((a, b) => {
if (a.weekYear !== b.weekYear) {
return a.weekYear - b.weekYear;
}
return a.weekNumber - b.weekNumber;
});
const orders = [
DateTime.local(2025, 3, 10),
DateTime.local(2025, 3, 12),
DateTime.local(2025, 3, 20)
];
const grouped = {};
for (const order of orders) {
const key =
`${order.weekYear}-W${order.weekNumber}`;
if (!grouped[key]) {
grouped[key] = [];
}
grouped[key].push(order.toISODate());
}
console.log(grouped);
Некоторые годы содержат 53 недели.
Проверка:
const date = DateTime.local(2020, 12, 31);
console.log(date.weekNumber);
Результат:
53
const currentWeek = DateTime.now().weekNumber;
console.log(currentWeek);
const currentWeekYear =
DateTime.now().weekYear;
console.log(currentWeekYear);
function generateWeeks(year, count) {
return Array.from(
{ length: count },
(_, i) => ({
weekYear: year,
weekNumber: i + 1
})
);
}
console.log(generateWeeks(2025, 10));
let current = DateTime.now();
function nextWeek() {
current = current.plus({ weeks: 1 });
}
function prevWeek() {
current = current.minus({ weeks: 1 });
}
Недельные интервалы часто применяются:
Пример формирования ключа аналитики:
const date = DateTime.now();
const analyticsKey =
`${date.weekYear}-W${date.weekNumber}`;
console.log(analyticsKey);
weekYearНеправильно:
const key = `${date.year}-${date.weekNumber}`;
Правильно:
const key =
`${date.weekYear}-${date.weekNumber}`;
year вместо weekYearconst date = DateTime.local(2021, 1, 1);
console.log(date.year);
console.log(date.weekYear);
Результат:
2021
2020
В ISO:
Понедельник = первый день недели
function printWeek(date) {
const start = date.startOf("week");
for (let i = 0; i < 7; i++) {
const day = start.plus({ days: i });
console.log(
day.toFormat("cccc dd.MM.yyyy")
);
}
}
printWeek(DateTime.now());
function filterByWeek(items, weekYear, weekNumber) {
return items.filter(item => {
return (
item.weekYear === weekYear &&
item.weekNumber === weekNumber
);
});
}
const now = DateTime.now();
const range = {
start: now.startOf("week"),
end: now.endOf("week")
};
console.log({
start: range.start.toISO(),
end: range.end.toISO()
});
const date = DateTime.now();
const label =
`Неделя ${date.weekNumber}`;
console.log(label);
function goToWeek(year, week) {
return DateTime.fromObject({
weekYear: year,
weekNumber: week,
weekday: 1
});
}
const result = goToWeek(2025, 30);
console.log(result.toISODate());