Библиотека Moment.js предоставляет удобные методы работы с датами и временем, включая манипуляции и вычисления. Одним из важных аспектов является округление результатов вычислений для временных интервалов, что особенно актуально при отображении длительности, разниц между датами или планировании событий.
Для вычисления разницы между датами используется метод
.diff(). Он возвращает число в единицах времени, указанных
в параметре. Пример:
const moment = require('moment');
let start = moment('2026-05-01');
let end = moment('2026-05-21');
let diffDays = end.diff(start, 'days'); // 20
let diffMonths = end.diff(start, 'months'); // 0
let diffYears = end.diff(start, 'years'); // 0
Метод .diff() по умолчанию возвращает целое
число, округленное вниз. Это поведение эквивалентно
использованию функции Math.floor.
Если требуется получить точное дробное значение,
необходимо передать третий аргумент { asFloat: true } или
использовать метод .as() библиотеки Moment
Duration:
let duration = moment.duration(end.diff(start));
console.log(duration.asDays()); // 20
console.log(duration.asHours()); // 480
Методы .asDays(), .asHours(),
.asMinutes() и аналогичные возвращают число с
плавающей точкой, позволяя применять любое арифметическое
округление.
После получения дробного значения можно применять стандартные функции JavaScript для округления:
n знаков после запятойПример использования с Moment.js:
let hours = duration.asHours(); // 480
let roundedHours = Math.round(hours); // 480
let roundedHoursTwoDecimals = Number(hours.toFixed(2)); // 480.00
Для отображения длительности удобно использовать объект
moment.duration() и комбинировать его с методами
округления:
let duration = moment.duration({ hours: 5, minutes: 34 });
let totalHours = duration.asHours(); // 5.566666...
let roundedHours = Math.floor(totalHours); // 5
let roundedMinutes = Math.round(duration.minutes()); // 34
Это позволяет получать корректное представление длительности в различных единицах, например, при формировании таймера или отчёта о времени.
При вычислении разницы между датами в месяцах или годах следует
учитывать, что .diff() возвращает целое количество
полных единиц, игнорируя оставшиеся дни:
let start = moment('2026-01-15');
let end = moment('2026-05-21');
let monthsDiff = end.diff(start, 'months'); // 4 (полных месяца)
let monthsDiffFloat = end.diff(start, 'months', true); // 4.1935...
Использование третьего аргумента true позволяет
получить дробное число, которое затем можно округлять
любым удобным способом.
При выводе округлённых значений можно использовать метод
.format() для отображения дат и времени в удобном
формате:
let now = moment();
let future = moment().add(5, 'days').add(3, 'hours');
let diffHours = future.diff(now, 'hours', true); // 123.5
let roundedHours = Math.ceil(diffHours); // 124
console.log(`До события осталось ${roundedHours} часов`);
.diff(..., ..., true) или
duration.as*().Math.floor или Math.round, чтобы результат был
интуитивно понятен..toFixed(n) с
последующим приведением к числу.Благодаря сочетанию методов diff,
duration.as*() и стандартных функций округления Moment.js
позволяет гибко управлять результатами и формировать точные и наглядные
данные о времени и длительности.