Библиотека Moment.js предоставляет отдельный тип данных для работы с
временными промежутками — Duration. В отличие от объекта
даты (Moment), который хранит конкретную точку времени,
объект длительности описывает интервал: количество секунд, минут, часов,
дней, месяцев или лет.
Объекты длительности используются для:
moment.duration()Основной способ создания объекта длительности:
moment.duration()
Метод возвращает экземпляр Duration.
const duration = moment.duration();
console.log(duration.asSeconds());
Результат:
0
Пустая длительность содержит нулевое значение всех единиц времени.
Наиболее простой вариант — передача числа миллисекунд.
const duration = moment.duration(5000);
console.log(duration.asSeconds());
Результат:
5
Значение 5000 интерпретируется как 5000 миллисекунд.
Второй аргумент определяет единицу времени.
const duration = moment.duration(30, 'seconds');
console.log(duration.asMinutes());
const duration = moment.duration(15, 'minutes');
console.log(duration.asSeconds());
const duration = moment.duration(2, 'hours');
console.log(duration.asMinutes());
const duration = moment.duration(7, 'days');
console.log(duration.asHours());
const duration = moment.duration(3, 'weeks');
console.log(duration.asDays());
const duration = moment.duration(6, 'months');
console.log(duration.asDays());
const duration = moment.duration(1, 'year');
console.log(duration.asMonths());
Moment.js поддерживает как полные, так и сокращённые формы.
| Полная форма | Сокращение |
|---|---|
| years | y |
| quarters | Q |
| months | M |
| weeks | w |
| days | d |
| hours | h |
| minutes | m |
| seconds | s |
| milliseconds | ms |
Пример:
moment.duration(5, 'd');
moment.duration(5, 'days');
Оба варианта эквивалентны.
Для сложных интервалов удобнее использовать объект.
const duration = moment.duration({
days: 2,
hours: 5,
minutes: 30
});
const duration = moment.duration({
years: 1,
months: 3,
days: 10,
hours: 12
});
Такой подход особенно удобен при работе с расписаниями, таймерами и вычислениями периодов.
После создания длительности можно извлекать отдельные части.
const duration = moment.duration({
hours: 2,
minutes: 45
});
console.log(duration.hours());
console.log(duration.minutes());
hours() и asHours()Это одна из самых важных особенностей работы с
Duration.
hours()Возвращает только часовую часть.
const duration = moment.duration({
days: 1,
hours: 5
});
console.log(duration.hours());
Результат:
5
asHours()Возвращает полное количество часов.
console.log(duration.asHours());
Результат:
29
Поскольку:
Moment.js поддерживает международный формат временных интервалов ISO 8601.
const duration = moment.duration('PT2H30M');
console.log(duration.asMinutes());
P[n]Y[n]M[n]DT[n]H[n]M[n]S
Обозначения:
| Символ | Значение |
|---|---|
| P | начало периода |
| Y | годы |
| M | месяцы |
| D | дни |
| T | разделитель даты и времени |
| H | часы |
| M | минуты |
| S | секунды |
moment.duration('PT2H30M');
moment.duration('P5D');
moment.duration('P1Y2M');
moment.duration('P3DT4H15M');
Moment.js позволяет получить длительность между двумя датами.
const start = moment('2025-01-01');
const end = moment('2025-01-10');
const duration = moment.duration(end.diff(start));
console.log(duration.asDays());
diff() вместе с duration()Метод diff() возвращает разницу между датами в
миллисекундах.
const date1 = moment('2025-05-01');
const date2 = moment('2025-05-15');
const diff = date2.diff(date1);
console.log(diff);
Эта разница может быть преобразована в объект длительности.
const duration = moment.duration(diff);
console.log(duration.days());
Moment.js поддерживает отрицательные интервалы.
const duration = moment.duration(-3, 'days');
console.log(duration.asDays());
Отрицательные длительности применяются:
const duration = moment.duration({
hours: 4,
minutes: 20,
seconds: 10
});
Такой формат удобен при получении данных от API или формы ввода.
Moment.js автоматически преобразует превышающие значения.
const duration = moment.duration({
minutes: 90
});
console.log(duration.hours());
console.log(duration.minutes());
Результат:
1
30
Duration поддерживает дробные числа.
const duration = moment.duration(1.5, 'hours');
console.log(duration.asMinutes());
Результат:
90
Moment.js может интерпретировать строковые значения.
const duration = moment.duration('02:30:00');
Однако такой способ считается менее надёжным по сравнению с ISO 8601.
Для проверки используется метод:
moment.isDuration()
Пример:
const duration = moment.duration(5, 'days');
console.log(moment.isDuration(duration));
const duration1 = moment.duration(2, 'hours');
const duration2 = moment.duration(duration1);
Создаётся независимая копия объекта.
Duration часто применяется вместе с объектами
Moment.
const now = moment();
const result = now.add(
moment.duration(3, 'days')
);
console.log(result.format());
const result = moment().subtract(
moment.duration(2, 'weeks')
);
duration.asSeconds();
duration.asMinutes();
duration.asHours();
duration.asDays();
duration.asWeeks();
duration.asMonths();
duration.asYears();
| Метод | Описание |
|---|---|
| milliseconds() | миллисекунды |
| seconds() | секунды |
| minutes() | минуты |
| hours() | часы |
| days() | дни |
| months() | месяцы |
| years() | годы |
Пример:
const duration = moment.duration({
days: 2,
hours: 10
});
console.log(duration.days());
console.log(duration.hours());
Месяцы и годы не имеют фиксированной продолжительности.
Например:
Поэтому:
moment.duration(1, 'month').asDays();
может давать результаты, основанные на внутренних вычислениях Moment.js, а не на конкретном календарном месяце.
Moment.js хранит длительность в нескольких категориях:
Это необходимо из-за различий календарных единиц.
Например:
days()
и asDays()const duration = moment.duration(48, 'hours');
console.log(duration.days());
console.log(duration.asDays());
Результат:
2
2
Но:
const duration = moment.duration(50, 'hours');
console.log(duration.days());
console.log(duration.asDays());
Результат:
2
2.0833333333333335
moment.duration(1, 'month').asDays();
Не следует считать эквивалентом строго 30 дней.
moment.duration('5 hours');
Подобные конструкции могут работать нестабильно в разных версиях библиотеки.
Предпочтительный вариант:
moment.duration(5, 'hours');
или:
moment.duration('PT5H');
const duration = moment.duration(90, 'seconds');
console.log(duration.minutes());
console.log(duration.seconds());
const workDay = moment.duration({
hours: 8,
minutes: 30
});
console.log(workDay.asMinutes());
const start = moment('2025-01-01');
const end = moment('2025-03-15');
const duration = moment.duration(
end.diff(start)
);
console.log(duration.asDays());
const meeting = moment();
meeting.add({
hours: 2,
minutes: 15
});
console.log(meeting.format());
Moment.js находится в режиме поддержки legacy-проектов. Команда разработчиков рекомендует использовать современные альтернативы:
Тем не менее, Moment.js продолжает активно использоваться в
существующих проектах, поэтому понимание работы Duration
остаётся важным навыком при сопровождении и модернизации
JavaScript-приложений.