Moment.js строится вокруг концепции последовательного преобразования объекта времени, где каждое изменение состояния может быть выполнено через вызов метода, возвращающего тот же экземпляр. Такой подход позволяет выстраивать цепочки операций, в которых дата последовательно модифицируется без промежуточных переменных.
Цепочка операций в Moment.js основана на том, что большинство методов
экземпляра возвращают сам объект moment. Это позволяет
вызывать следующий метод сразу после предыдущего:
const result = moment()
.add(2, 'days')
.subtract(3, 'hours')
.startOf('day')
.format('YYYY-MM-DD HH:mm');
Каждый вызов изменяет внутреннее состояние объекта и возвращает тот же самый экземпляр, что делает возможным линейное построение выражений.
Подобная модель отличается от функционального подхода с неизменяемыми структурами данных: здесь объект времени изменяется на месте.
Ключевая особенность цепочек в Moment.js — изменяемость (mutability). Любая операция, выполненная в цепочке, влияет на исходный объект.
const m = moment();
const a = m.add(1, 'day');
const b = m.add(1, 'day');
console.log(a.format());
console.log(b.format());
Оба результата будут зависеть от последовательного изменения одного и
того же объекта, поскольку m, a и
b ссылаются на один экземпляр.
Такое поведение делает цепочки компактными, но требует контроля над состоянием объекта, особенно при повторном использовании переменных.
Цепочки операций формируются комбинацией различных групп методов:
add(value, unit) — добавление времениsubtract(value, unit) — вычитание времениmoment()
.add(1, 'month')
.subtract(10, 'days');
Эти методы изменяют текущий момент времени, смещая его относительно исходной точки.
startOf(unit) — начало периодаendOf(unit) — конец периодаmoment()
.startOf('year')
.add(6, 'months')
.endOf('month');
Операции округления часто используются в начале или середине цепочки, так как они радикально меняют значение даты.
utc() — переход в UTClocal() — переход в локальную временную зонуmoment()
.utc()
.add(5, 'hours')
.local();
Эти методы также участвуют в цепочках и влияют на интерпретацию всех последующих операций.
format(pattern) — преобразование в строкуmoment()
.add(3, 'days')
.startOf('day')
.format('DD.MM.YYYY');
Метод format завершает цепочку, возвращая строковое
представление даты.
Цепочка выполняется строго слева направо. Каждая операция получает результат предыдущей:
moment()
.add(1, 'day')
.add(2, 'hours')
.startOf('hour');
Порядок имеет критическое значение, поскольку:
Изменение порядка методов приводит к различным результатам даже при одинаковом наборе операций.
Для создания независимых цепочек используется метод
clone(). Он создаёт копию текущего состояния объекта:
const base = moment();
const a = base.clone().add(1, 'day');
const b = base.clone().subtract(1, 'day');
Без clone() оба варианта ссылались бы на один объект и
взаимно изменяли бы результат.
Клонирование используется при необходимости параллельных вычислений на основе одной точки отсчёта.
Цепочки позволяют строить выражения, описывающие комплексные временные правила:
const deadline = moment()
.add(2, 'weeks')
.startOf('day')
.subtract(1, 'second')
.format();
Такие конструкции часто применяются при расчёте дедлайнов, окон доступности и календарных интервалов.
Некоторые методы не просто изменяют время, но и влияют на дальнейшую интерпретацию:
moment()
.utc()
.add(1, 'day')
.startOf('month')
.local()
.format();
Здесь переключение временной зоны в начале цепочки определяет базу расчётов для всех последующих операций, даже после возврата в локальный контекст.
При работе с цепочками проявляются характерные свойства:
format() завершает цепочку, превращая объект в
строкуЦепочки позволяют выразить преобразование даты как последовательность шагов:
const reportDate = moment()
.startOf('quarter')
.add(15, 'days')
.endOf('day')
.format('YYYY-MM-DD HH:mm');
Каждый метод представляет отдельный этап трансформации, что делает структуру вычисления линейной и предсказуемой при правильном контроле состояния объекта.
Повторное использование базового объекта без клонирования приводит к накоплению изменений:
const base = moment();
const first = base.add(1, 'day');
const second = base.add(1, 'day');
Оба результата зависят от последовательного изменения одного экземпляра, что делает поведение цепочки кумулятивным.
Клонирование устраняет этот эффект:
const base = moment();
const first = base.clone().add(1, 'day');
const second = base.clone().add(1, 'day');
Цепочки операций в Moment.js не являются чистыми функциями. Их использование сопровождается рядом ограничений:
Несмотря на это, цепочный стиль остаётся компактным способом описания последовательных преобразований времени, где каждый метод логически продолжает предыдущий шаг.