Настройка первого дня недели

Moment.js предоставляет мощный инструмент для работы с датами и временем в JavaScript, включая возможность конфигурирования локализации и календарных настроек. Одним из важных аспектов локализации является определение первого дня недели, который может различаться в зависимости от страны или стандарта: в большинстве стран Европы неделя начинается с понедельника, тогда как в США – с воскресенья.

Установка и подключение Moment.js

Для использования Moment.js необходимо подключить библиотеку. В Node.js это делается через npm:

npm install moment

В коде:

const moment = require('moment');

Для работы с локалями потребуется также подключить локальные настройки:

require('moment/locale/ru');

Определение первого дня недели

Moment.js позволяет настраивать первый день недели через локаль, используя функцию updateLocale. По умолчанию в русской локали неделя начинается с понедельника (день 1), а в английской – с воскресенья (день 0).

Пример настройки:

moment.updateLocale('ru', {
    week: {
        dow: 1, // первый день недели: 0 — воскресенье, 1 — понедельник
        doy: 7  // первый день года, который определяет первую неделю
    }
});
  • dow (day of week) – определяет первый день недели (0–6).
  • doy (day of year) – указывает, какой день года считается первым для вычисления первой недели. Этот параметр влияет на функции типа week().

Проверка текущего первого дня недели

После настройки локали можно проверить текущий первый день недели с помощью:

const firstDay = moment.localeData().firstDayOfWeek();
console.log(firstDay); // 1 для понедельника

Влияние на вычисления недель

Первый день недели напрямую влияет на методы работы с неделями, такие как:

  • moment().week() – возвращает номер текущей недели в году.
  • moment().startOf('week') – возвращает начало недели.
  • moment().endOf('week') – возвращает конец недели.

Пример:

moment.updateLocale('ru', { week: { dow: 1, doy: 7 } });

const startOfWeek = moment().startOf('week'); // Понедельник текущей недели
const endOfWeek = moment().endOf('week');     // Воскресенье текущей недели

Если изменить dow на 0:

moment.updateLocale('ru', { week: { dow: 0, doy: 7 } });

const startOfWeekSunday = moment().startOf('week'); // Воскресенье
const endOfWeekSaturday = moment().endOf('week');   // Суббота

Настройка для разных локалей

Moment.js позволяет настроить индивидуальные локали:

moment.defineLocale('customLocale', {
    months : 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split('_'),
    weekdays : 'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split('_'),
    week: {
        dow: 1,
        doy: 7
    }
});

moment.locale('customLocale');

Это позволяет использовать отдельные настройки недели без изменения глобальной локали.

Практические рекомендации

  1. Для проектов, ориентированных на конкретный регион, рекомендуется явно указывать первый день недели.
  2. Функция updateLocale предпочтительнее, чем изменение глобальной локали, если требуется динамическая настройка.
  3. Методы startOf('week') и endOf('week') должны применяться только после корректной настройки dow, иначе расчеты могут быть некорректны.
  4. В сочетании с week() и isoWeek() можно реализовать гибкие вычисления номеров недель по ISO-стандарту или национальным стандартам.

Особенности использования с ISO-неделями

Moment.js поддерживает ISO-нумерацию недель, где:

  • Неделя начинается с понедельника (dow: 1).
  • Первая неделя года — та, которая содержит 4 января (doy: 4).

Пример:

moment.updateLocale('ru', { week: { dow: 1, doy: 4 } });
console.log(moment().isoWeek()); // Номер недели по ISO

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

Итоговое применение

Настройка первого дня недели позволяет корректно:

  • Рассчитывать номера недель.
  • Определять начало и конец недели.
  • Работать с локализованными календарными интерфейсами.

Такая конфигурация делает Moment.js универсальным инструментом для любых проектов, где учет недельного периода критичен.