В библиотеке Moment.js управление датой и временем основано на мутабельной модели: объект момента может изменять своё состояние после создания. Это означает, что установка отдельных компонентов времени напрямую изменяет исходный экземпляр, если не использовать явное клонирование.
Основная логика установки значений строится вокруг двух подходов:
set, принимающий имя поля и
значение либо объект с несколькими полями.Такой подход позволяет гибко управлять временными данными на уровне отдельных единиц измерения: года, месяца, дня, часа, минуты и т.д.
Moment.js предоставляет набор методов, соответствующих отдельным частям даты и времени.
moment().year(2025);
Метод устанавливает полный год календарной даты.
Эквивалент в цепочке:
moment().set('year', 2025);
moment().month(0); // январь
moment().month(11); // декабрь
Особенность реализации: месяцы нумеруются с нуля, что требует аккуратности при вычислениях и преобразованиях.
moment().date(15);
Метод изменяет календарный день месяца (от 1 до 31 в зависимости от месяца).
moment().hour(18);
Используется 24-часовой формат времени.
moment().minute(30);
moment().second(45);
moment().millisecond(500);
Метод set позволяет изменять любой компонент даты через
строковый идентификатор.
moment().set('year', 2024);
moment().set('month', 6);
moment().set('date', 10);
moment().set('hour', 9);
yearmonthdatehourminutesecondmillisecondmoment().set({
year: 2023,
month: 4,
date: 20,
hour: 14,
minute: 45
});
Такой формат используется при пакетной настройке даты, когда требуется одномоментное изменение нескольких полей.
Каждое изменение состояния объекта Moment.js изменяет исходный экземпляр:
const m = moment();
m.year(2020);
console.log(m.year()); // 2020
Это поведение может приводить к побочным эффектам при повторном использовании переменных.
Для предотвращения изменения исходного значения используется клонирование:
const m1 = moment();
const m2 = m1.clone().year(2025);
Помимо изменения уже созданного объекта, значения могут задаваться при инициализации.
moment('2024-06-15');
moment('15/06/2024', 'DD/MM/YYYY');
moment([2024, 5, 15]);
Порядок элементов:
Для приведения даты к границам временного интервала используются методы нормализации состояния.
moment().startOf('day');
Устанавливает время на 00:00:00.000.
Поддерживаемые единицы:
moment().endOf('day');
Устанавливает максимальное значение времени внутри выбранного
периода, например 23:59:59.999 для дня.
Методы установки поддерживают цепочную структуру вызовов:
moment()
.year(2022)
.month(10)
.date(5)
.hour(12);
Или через универсальный интерфейс:
moment()
.set('year', 2022)
.set('month', 10)
.set('date', 5);
При установке значений Moment.js автоматически корректирует выходящие за пределы значения:
moment().month(12);
Результат автоматически переносится на следующий год с корректировкой месяца.
Аналогично:
moment().date(32);
Переход выполняется в следующий месяц с перерасчётом остатка дней.
При последовательной установке компонентов порядок операций влияет на итоговое значение:
moment()
.date(31)
.month(1);
При установке февраля значение дня может быть скорректировано в зависимости от количества дней в месяце.
Обратный порядок:
moment()
.month(1)
.date(31);
приводит к другой нормализации, так как февраль не содержит 31 дня.
Moment.js выполняет автоматическую валидацию и коррекцию:
Invalid date.moment().year('invalid'); // Invalid date
Установка значений осуществляется в локальном часовом поясе среды выполнения, если не используется специализированная конфигурация часовых зон. Изменение компонентов времени не изменяет часовой пояс, а только пересчитывает абсолютное значение даты внутри текущего контекста времени.