Расчёт разницы времени в moment.js: корректное преобразование
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для расчета разницы между двумя временными точками в JavaScript, вы можете воспользоваться подходом с объектами Date:
const начало = new Date('2023-01-01T00:00:00');
const конец = new Date('2023-01-01T02:30:00');
const разницаЧасы = (конец – начало) / 3.6e6; // С помощью научной нотации получаем разницу времени в часах
console.log(разницаЧасы); // Вывод: 2.5 часа
Для получения разницы в минутах используйте деление на 60000
, а для получения разницы в секундах — на 1000
.
Облегчаем работу с датами с помощью moment.js
Сложные задачи, связанные с учетом часовых поясов и переходах на летнее время, можно упростить с использованием библиотеки moment.js
:
const moment = require('moment'); // Подключаем библиотеку moment.js
const начало = moment('2023-03-10T03:00:00Z');
const конец = moment('2023-03-11T04:00:00Z');
const разница = конец.diff(начало); // Рассчитываем разницу между датами
console.log(moment.utc(разница).format('HH:mm:ss')); // Выводим разницу в часах, минутах и секундах
При расчете продолжительности более 24 часов используйте метод moment.duration()
:
const длительность = moment.duration(разница);
console.log(`${длительность.days()} дней ${длительность.hours()} часов ${длительность.minutes()} минут`);
А для более элегантного отображения продолжительности можно использовать плагин moment-duration-format
:
moment.duration(разница).format("d[d] h[h] m[m] s[s]"); // Форматируем продолжительность в стиле "д[д] ч[ч] м[м] с[с]"
Основное, что стоит помнить: работы с датами и временем требуют точности и аккуратности.
Разбивка долгого промежутка времени на составляющие
Длинный промежуток времени может быть удобнее понимать, если разбить его на части:
const разницаВМс = конец – начало; // Рассчитываем разницу между датами в миллисекундах
const разницаДни = Math.floor(разницаВМс / 86400000); // Определяем количество дней
const разницаЧасы = Math.floor((разницаВМс % 86400000) / 3600000); // Определяем количество часов
const разницаМинуты = Math.round(((разницаВМс % 86400000) % 3600000) / 60000); // Определяем количество минут
console.log(`Дней: ${разницаДни}, Часов: ${разницаЧасы}, Минут: ${разницаМинуты}`); // Выводим численную разницу в удобочитаемом формате
Для более "человеческого" формата используйте метод moment.humanize()
:
console.log(moment.duration(начало.diff(конец)).humanize()); // Получаем разницу в более понятном формате
Индивидуальное форматирование длительности
const разница = moment.duration(начало.diff(конец));
const отформатировано = [
parseInt(разница.asHours()),
разница.minutes(),
разница.seconds()
].join(':').padStart(2, '0');
console.log(отформатировано); // Выводим отформатированное время
Следите за учетом часовых поясов и переходами на летнее время, они могут влиять на корректность расчетов.
Визуализация
Для примера, у нас есть две временные точки:
Время начала: 🏁 1:00 PM
Время окончания: 🏁 1:45 PM
Представим их в коде:
const начальноеВремя = new Date('2023-09-14T13:00:00');
const конечноеВремя = new Date('2023-09-14T13:45:00');
const разницаВремени = (конечноеВремя – начальноеВремя) / 60000; // Рассчитываем разницу времени в минутах
Приведем результат в виде таблицы:
| Событие | Символ | Время |
| -------------- | ------ | -------- |
| Начало | 🏁 | 1:00 PM |
| Окончание | 🏁 | 1:45 PM |
| Затраченное время | 🏆 | 45 мин |
Обработка "неправильных" форматов дат
Некорректные форматы datetime могут вызвать ошибки, поэтому всегда проверяйте, что форматы ваших даты соответствуют ожидаемым.
if (!moment(начало).isValid() || !moment(конец).isValid()) {
// есть проблема с форматом даты
}
Стандартные методы могут быть неэффективны для продолжительностей, превышающих сутки, поэтому может быть полезно создать свой собственный метод форматирования.
Несколько нюансов для учета
Не забывайте о миллисекундах: всегда преобразуйте продолжительность в миллисекунды для большей точности с помощью moment.js
. Затем можно вернуть результат в более понятном формате.
Полезные материалы
- Дата – JavaScript | MDN — подробная документация объекта Date в JavaScript.
- Справочник по датам в JavaScript — полезный справочник методов Date в JavaScript.
- date-fns – современная библиотека JS для работы с датами — библиотека для упрощения работы с датами в JavaScript.
- Moment.js | Главная — популярная библиотека для работы с датами в JavaScript.
- Day.js · 2кБ JavaScript библиотека даты — альтернатива Moment.js с аналогичным API.
- luxon – Независимая библиотека для работы с датами — современная и функциональная библиотека для работы с датами и временем.