При работе с календарями и расписаниями часто требуется определить
номер дня недели, вычислить ближайший понедельник, сгруппировать данные
по будням или преобразовать локальное представление даты в числовой
формат. Библиотека Luxon предоставляет удобные свойства и
методы для подобных задач.
Основным объектом для работы с датами является
DateTime.
import { DateTime } from "luxon";
Свойство weekday возвращает номер дня недели.
const date = DateTime.now();
console.log(date.weekday);
В Luxon используется международный стандарт ISO
8601:
| День недели | Значение |
|---|---|
| Понедельник | 1 |
| Вторник | 2 |
| Среда | 3 |
| Четверг | 4 |
| Пятница | 5 |
| Суббота | 6 |
| Воскресенье | 7 |
Пример:
const date = DateTime.fromISO("2025-03-19");
console.log(date.weekday);
Результат:
3
Дата 2025-03-19 соответствует среде.
Числовой номер часто используется совместно с текстовым представлением.
const date = DateTime.now();
console.log(date.weekday);
console.log(date.weekdayLong);
console.log(date.weekdayShort);
Пример результата:
5
Friday
Fri
| Свойство | Пример |
|---|---|
weekdayLong |
Monday |
weekdayShort |
Mon |
toFormat("cccc") |
Monday |
toFormat("ccc") |
Mon |
Luxon поддерживает локализацию через setLocale.
const date = DateTime.now().setLocale("ru");
console.log(date.weekdayLong);
console.log(date.weekdayShort);
Результат:
пятница
пт
const date = DateTime.now();
const isWeekend = date.weekday >= 6;
console.log(isWeekend);
const isWorkday = date.weekday <= 5;
console.log(isWorkday);
const date = DateTime.now();
switch (date.weekday) {
case 1:
console.log("Понедельник");
break;
case 5:
console.log("Пятница");
break;
case 6:
case 7:
console.log("Выходной");
break;
default:
console.log("Обычный рабочий день");
}
Метод startOf("week") возвращает начало недели.
const date = DateTime.fromISO("2025-03-19");
const startWeek = date.startOf("week");
console.log(startWeek.toISODate());
Результат:
2025-03-17
По стандарту ISO неделя начинается с понедельника.
const date = DateTime.fromISO("2025-03-19");
const endWeek = date.endOf("week");
console.log(endWeek.toISO());
Пример результата:
2025-03-23T23:59:59.999+03:00
const date = DateTime.now();
const nextMonday = date.plus({
days: 8 - date.weekday
});
console.log(nextMonday.toISODate());
Если сегодня:
| День | weekday |
|---|---|
| Понедельник | 1 |
| Вторник | 2 |
| Среда | 3 |
Тогда выражение:
8 - date.weekday
даёт количество дней до следующего понедельника.
const date = DateTime.now();
const previousSunday = date.minus({
days: date.weekday
});
console.log(previousSunday.toISODate());
const start = DateTime.now().startOf("week");
const days = Array.from({ length: 7 }, (_, i) =>
start.plus({ days: i })
);
days.forEach(day => {
console.log(day.weekday, day.weekdayLong);
});
Результат:
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
Номер дня недели удобно использовать при сортировке.
const dates = [
DateTime.fromISO("2025-03-21"),
DateTime.fromISO("2025-03-17"),
DateTime.fromISO("2025-03-19")
];
dates.sort((a, b) => a.weekday - b.weekday);
dates.forEach(date => {
console.log(date.weekdayLong);
});
const dates = [
DateTime.fromISO("2025-03-17"),
DateTime.fromISO("2025-03-22"),
DateTime.fromISO("2025-03-23")
];
const workdays = dates.filter(date => date.weekday <= 5);
console.log(
workdays.map(d => d.toISODate())
);
const events = [
{
title: "Планёрка",
date: DateTime.fromISO("2025-03-17")
},
{
title: "Созвон",
date: DateTime.fromISO("2025-03-18")
},
{
title: "Отчёт",
date: DateTime.fromISO("2025-03-17")
}
];
const grouped = {};
for (const event of events) {
const key = event.date.weekday;
if (!grouped[key]) {
grouped[key] = [];
}
grouped[key].push(event.title);
}
console.log(grouped);
Эти свойства имеют разное назначение.
| Свойство | Значение |
|---|---|
day |
День месяца |
weekday |
День недели |
Пример:
const date = DateTime.fromISO("2025-03-19");
console.log(date.day);
console.log(date.weekday);
Результат:
19
3
Номер дня недели можно выводить через форматирование.
const date = DateTime.now();
console.log(date.toFormat("c"));
Пример:
5
| Токен | Значение |
|---|---|
c |
Номер дня недели |
ccc |
Короткое название |
cccc |
Полное название |
Пример:
console.log(date.toFormat("cccc"));
Номер дня недели зависит от часового пояса.
const utc = DateTime.now().setZone("UTC");
const almaty = utc.setZone("Asia/Almaty");
console.log(utc.weekday);
console.log(almaty.weekday);
Если время находится около полуночи, номер дня недели может различаться.
Стандартный объект Date использует другую систему.
const date = new Date();
console.log(date.getDay());
Таблица значений:
| День | getDay() |
|---|---|
| Воскресенье | 0 |
| Понедельник | 1 |
| Суббота | 6 |
const date = DateTime.now();
console.log(date.weekday);
Таблица значений:
| День | weekday |
|---|---|
| Понедельник | 1 |
| Воскресенье | 7 |
ISO-подход считается более удобным для бизнес-логики и календарных вычислений.
Иногда требуется совместимость со старым API.
const luxonWeekday = DateTime.now().weekday;
const jsWeekday = luxonWeekday % 7;
console.log(jsWeekday);
Соответствие:
| Luxon | JavaScript |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 0 |
function countWorkdays(start, end) {
let current = start;
let total = 0;
while (current <= end) {
if (current.weekday <= 5) {
total++;
}
current = current.plus({ days: 1 });
}
return total;
}
const start = DateTime.fromISO("2025-03-01");
const end = DateTime.fromISO("2025-03-31");
console.log(countWorkdays(start, end));
const start = DateTime.now().startOf("week");
for (let i = 0; i < 7; i++) {
const day = start.plus({ days: i });
console.log(
`${day.weekday}. ${day.weekdayLong}`
);
}
const today = DateTime.now();
console.log(today.weekdayLong);
С локализацией:
const today = DateTime.now()
.setLocale("ru");
console.log(today.weekdayLong);
const names = {
1: "Пн",
2: "Вт",
3: "Ср",
4: "Чт",
5: "Пт",
6: "Сб",
7: "Вс"
};
const date = DateTime.now();
console.log(names[date.weekday]);
Часто сервер возвращает номера дней недели.
const payload = {
weekday: DateTime.now().weekday
};
console.log(JSON.stringify(payload));
Результат:
{
"weekday": 5
}
const lessons = [
{
weekday: 1,
subject: "Математика"
},
{
weekday: 3,
subject: "Физика"
},
{
weekday: 5,
subject: "Информатика"
}
];
const today = DateTime.now().weekday;
const todayLessons = lessons.filter(
lesson => lesson.weekday === today
);
console.log(todayLessons);
console.log(DateTime.now().weekday);
Результат никогда не будет 0.
Неверно:
if (date.day === 1)
Правильно:
if (date.weekday === 1)
const date = DateTime.now().setZone("UTC");
При смене зоны дата может перейти на другой день недели.
| Операция | Решение |
|---|---|
| Получить день недели | date.weekday |
| Получить название | date.weekdayLong |
| Получить короткое имя | date.weekdayShort |
| Проверить выходной | weekday >= 6 |
| Проверить будний день | weekday <= 5 |
| Начало недели | startOf("week") |
| Конец недели | endOf("week") |
| Форматирование | toFormat("c") |
| Русская локализация | setLocale("ru") |