Нумерация дней недели

При работе с календарями и расписаниями часто требуется определить номер дня недели, вычислить ближайший понедельник, сгруппировать данные по будням или преобразовать локальное представление даты в числовой формат. Библиотека Luxon предоставляет удобные свойства и методы для подобных задач.

Основным объектом для работы с датами является DateTime.

import { DateTime } from "luxon";

Свойство weekday

Свойство 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);

Использование weekday в условиях

Выполнение логики по дням недели

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())
);

Создание расписания по weekday

Группировка событий

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);

Разница между weekday и day

Эти свойства имеют разное назначение.

Свойство Значение
day День месяца
weekday День недели

Пример:

const date = DateTime.fromISO("2025-03-19");

console.log(date.day);
console.log(date.weekday);

Результат:

19
3

Использование weekday в toFormat

Номер дня недели можно выводить через форматирование.

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);

Если время находится около полуночи, номер дня недели может различаться.


ISO-нумерация и JavaScript Date

Стандартный объект Date использует другую систему.

JavaScript Date

const date = new Date();

console.log(date.getDay());

Таблица значений:

День getDay()
Воскресенье 0
Понедельник 1
Суббота 6

Luxon

const date = DateTime.now();

console.log(date.weekday);

Таблица значений:

День weekday
Понедельник 1
Воскресенье 7

ISO-подход считается более удобным для бизнес-логики и календарных вычислений.


Преобразование weekday в систему JavaScript

Иногда требуется совместимость со старым 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]);

Использование weekday в REST API

Часто сервер возвращает номера дней недели.

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);

Типичные ошибки

Ошибка: ожидание воскресенья как 0

console.log(DateTime.now().weekday);

Результат никогда не будет 0.


Ошибка: путаница между day и weekday

Неверно:

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")