Какой способ подсчета временной разницы между двумя датами в секундах, минутах, часах и других единицах времени является наиболее эффективным?

Привет!
У меня на сайте каждую секунду вызывается функция, которая рассчитывает, сколько времени прошло с заданной даты. Однако, в моем коде почему-то неправильно вычисляются годы, месяцы, дни и часы. Вот мой код:
```javascript
var today = new Date()
var my_date = new Date("2023-12-29 00:00:00")
var diff = new Date(today - my_date)
console.log("лет: " + diff.getFullYear(), "месяцев: " + diff.getMonth(), "дней: " + diff.getDate(), "часов: " + diff.getHours(), "минут: " + diff.getMinutes(), "секунд: " + diff.getSeconds())
```
Почему так происходит, и как можно исправить эту проблему?
  • 28 декабря 2023 г. 22:37
Ответы на вопрос 2
Проблема с вашим кодом заключается в том, что объект `diff` является экземпляром класса `Date`, который представляет конкретную дату и время. Методы, такие как `getFullYear()`, `getMonth()`, `getDate()`, `getHours()`, `getMinutes()` и `getSeconds()`, возвращают значения на основе указанной даты, а не разницы между двумя датами.

Для правильного подсчета разницы времени между двумя датами в JavaScript можно использовать следующий подход:

```javascript
var today = new Date();
var my_date = new Date("2023-12-29 00:00:00");
var diff = today.getTime() - my_date.getTime(); // разница в миллисекундах

var seconds = Math.floor(diff / 1000); // количество секунд
var minutes = Math.floor(diff / (1000 * 60)); // количество минут
var hours = Math.floor(diff / (1000 * 60 * 60)); // количество часов
var days = Math.floor(diff / (1000 * 60 * 60 * 24)); // количество дней
var months = Math.floor(diff / (1000 * 60 * 60 * 24 * 30)); // количество месяцев
var years = Math.floor(diff / (1000 * 60 * 60 * 24 * 365)); // количество лет

console.log("лет: " + years, "месяцев: " + months, "дней: " + days, "часов: " + hours, "минут: " + minutes, "секунд: " + seconds);
```

В этом коде мы сначала вычисляем разницу между двумя датами в миллисекундах, затем используем деление и математические функции `Math.floor()` для получения разницы в секундах, минутах, часах, днях, месяцах и годах.

Такой подход будет более эффективным и точным для вычисления разницы между двумя датами.
Чтобы понять почему достаточно вывести в консоль diff и посмотреть, что это. Это дата, созданная на основе разницы дат. А разница дат - это количество миллисекунд между этими датами. Соответственно new Date() создаcт дату  1970-01-01 + то самое количество миллисекунд. 
Поэтому getFullYear() этой даты - это 1970, getMonth() - номер месяца и т.д.

Считать разницу в других единицах нужно уже математически. Получить секунды - поделить миллисекунды на 1000, а этот результат на 60 - минуты, ещё на 60 - часы, на 24 - дни. Дальше уже сложнее - нужно учитывать длину месяцев, которые между датами и длину лет (високосный или нет). Проще для этого использовать какую-нибудь библиотеку типа moment.js или date-fns. Ну или можно просто грубо округлить.
Похожие вопросы