Установка конкретных значений

В библиотеке 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

Метод set позволяет изменять любой компонент даты через строковый идентификатор.

Синтаксис

moment().set('year', 2024);
moment().set('month', 6);
moment().set('date', 10);
moment().set('hour', 9);

Поддерживаемые ключи

  • year
  • month
  • date
  • hour
  • minute
  • second
  • millisecond

Установка нескольких значений через объект

moment().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]);

Порядок элементов:

  • год
  • месяц (начиная с 0)
  • день
  • час (опционально)
  • минуты (опционально)
  • секунды (опционально)
  • миллисекунды (опционально)

Установка через начало и конец периода

Для приведения даты к границам временного интервала используются методы нормализации состояния.

Начало периода

moment().startOf('day');

Устанавливает время на 00:00:00.000.

Поддерживаемые единицы:

  • year
  • month
  • week
  • day
  • hour
  • minute
  • second

Конец периода

moment().endOf('day');

Устанавливает максимальное значение времени внутри выбранного периода, например 23:59:59.999 для дня.


Взаимодействие set с цепочками вызовов

Методы установки поддерживают цепочную структуру вызовов:

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

Согласование локального времени

Установка значений осуществляется в локальном часовом поясе среды выполнения, если не используется специализированная конфигурация часовых зон. Изменение компонентов времени не изменяет часовой пояс, а только пересчитывает абсолютное значение даты внутри текущего контекста времени.