logo

Расчёт разницы времени в moment.js: корректное преобразование

Быстрый ответ

Для расчета разницы между двумя временными точками в JavaScript, вы можете воспользоваться подходом с объектами Date:

JS
Скопировать код
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:

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():

JS
Скопировать код
const длительность = moment.duration(разница); 
console.log(`${длительность.days()} дней ${длительность.hours()} часов ${длительность.minutes()} минут`);

А для более элегантного отображения продолжительности можно использовать плагин moment-duration-format:

JS
Скопировать код
moment.duration(разница).format("d[d] h[h] m[m] s[s]"); // Форматируем продолжительность в стиле "д[д] ч[ч] м[м] с[с]"

Основное, что стоит помнить: работы с датами и временем требуют точности и аккуратности.

Разбивка долгого промежутка времени на составляющие

Длинный промежуток времени может быть удобнее понимать, если разбить его на части:

JS
Скопировать код
const разницаВМс = конец – начало; // Рассчитываем разницу между датами в миллисекундах
const разницаДни = Math.floor(разницаВМс / 86400000); // Определяем количество дней
const разницаЧасы = Math.floor((разницаВМс % 86400000) / 3600000); // Определяем количество часов
const разницаМинуты = Math.round(((разницаВМс % 86400000) % 3600000) / 60000); // Определяем количество минут

console.log(`Дней: ${разницаДни}, Часов: ${разницаЧасы}, Минут: ${разницаМинуты}`); // Выводим численную разницу в удобочитаемом формате

Для более "человеческого" формата используйте метод moment.humanize():

JS
Скопировать код
console.log(moment.duration(начало.diff(конец)).humanize()); // Получаем разницу в более понятном формате

Индивидуальное форматирование длительности

JS
Скопировать код
const разница = moment.duration(начало.diff(конец));
const отформатировано = [
  parseInt(разница.asHours()), 
  разница.minutes(), 
  разница.seconds()
].join(':').padStart(2, '0'); 

console.log(отформатировано); // Выводим отформатированное время

Следите за учетом часовых поясов и переходами на летнее время, они могут влиять на корректность расчетов.

Визуализация

Для примера, у нас есть две временные точки:

Markdown
Скопировать код
Время начала: 🏁 1:00 PM
Время окончания: 🏁 1:45 PM

Представим их в коде:

JS
Скопировать код
const начальноеВремя = new Date('2023-09-14T13:00:00');
const конечноеВремя = new Date('2023-09-14T13:45:00');
const разницаВремени = (конечноеВремя – начальноеВремя) / 60000; // Рассчитываем разницу времени в минутах

Приведем результат в виде таблицы:

Markdown
Скопировать код
| Событие       | Символ | Время    |
| -------------- | ------ | --------  |
| Начало         | 🏁     | 1:00 PM  |
| Окончание      | 🏁     | 1:45 PM  |
| Затраченное время  | 🏆     | 45 мин  |

Обработка "неправильных" форматов дат

Некорректные форматы datetime могут вызвать ошибки, поэтому всегда проверяйте, что форматы ваших даты соответствуют ожидаемым.

JS
Скопировать код
if (!moment(начало).isValid() || !moment(конец).isValid()) {
  // есть проблема с форматом даты
}

Стандартные методы могут быть неэффективны для продолжительностей, превышающих сутки, поэтому может быть полезно создать свой собственный метод форматирования.

Несколько нюансов для учета

Не забывайте о миллисекундах: всегда преобразуйте продолжительность в миллисекунды для большей точности с помощью moment.js. Затем можно вернуть результат в более понятном формате.

Полезные материалы

  1. Дата – JavaScript | MDN — подробная документация объекта Date в JavaScript.
  2. Справочник по датам в JavaScript — полезный справочник методов Date в JavaScript.
  3. date-fns – современная библиотека JS для работы с датами — библиотека для упрощения работы с датами в JavaScript.
  4. Moment.js | Главная — популярная библиотека для работы с датами в JavaScript.
  5. Day.js · 2кБ JavaScript библиотека даты — альтернатива Moment.js с аналогичным API.
  6. luxon – Независимая библиотека для работы с датами — современная и функциональная библиотека для работы с датами и временем.