@razrab228
html, люблю больше php.

Как посчитать разницу между двумя датами в секундах, минутах, часах и т.д.?

Здравствуйте!
У меня на сайте каждую секунду вызывается функция, которая рассчитывает, сколько прошло с даты, которая записана в переменной. Вот мой код:
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())

но, если смотреть в консоль, то секунды и минуты ещё сходятся, но вот остальное явно неверно. Почему так происходит, и как такое можно решить?
  • Вопрос задан
  • 404 просмотра
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега JavaScript
Python, JS, WordPress, SEO, Bots, Adversting
Почему так происходит, и как такое можно решить?

Потому что объект Date возвращает дату, а не интервал времени. Попробуйте так:
function getTimeDiff(startDate, endDate) {
  const diff = endDate - startDate;

  const seconds = Math.floor(diff / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  const days = Math.floor(hours / 24);
  const months = Math.floor(days / 30); // ~30
  const years = Math.floor(days / 365); // ~365

  return {
    years,
    months: months % 12,
    days: days % 30,
    hours: hours % 24,
    minutes: minutes % 60,
    seconds: seconds % 60
  };
}

const today = new Date();
const targetDate = new Date("2023-12-29 00:00:00");
const diff = getTimeDiff(targetDate, today);

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

// Разница, лет: 0, месяцев: 0, дней: 0, часов: 9, минут: 51, секунд: 22
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
XanXanXan
@XanXanXan
Чтобы понять почему, достаточно вывести в консоль diff и посмотреть, что это. Это дата, созданная на основе разницы дат. А разница дат - это количество миллисекунд между этими датами. Соответственно new Date() создаcт дату 1970-01-01 + то самое количество миллисекунд.
Поэтому getFullYear() для этой даты возвращает 1970, getMonth() - номер месяца и т.д.

Считать разницу в других единицах нужно уже математически. Получить секунды - поделить миллисекунды на 1000, а этот результат на 60 - минуты, ещё на 60 - часы, на 24 - дни. Дальше уже сложнее - нужно учитывать длину месяцев, которые между датами и длину лет (високосный или нет). Проще для этого использовать какую-нибудь библиотеку типа moment.js или date-fns. Ну или можно просто грубо округлить.
Ответ написан
Комментировать
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
Длины секунд, минут, часов и дней - не меняются, поэтому их легко подсчитать (делить последовательно разницу на 1000, 60, 60, 24). А вот стабильного понятия "месяц" или "год" не существует. Хотя можно также использовать делители (365,25/12) и 365,25, это может оказаться "приемлемо точно"

Можно использовать и ваш код, с условием что там будет
(getFullYear()-1700)
и что кол-во лет, и особенно месяцев - весьма условно. Точнее, оно такое если этот промежуток считать с "нулевого времени" - 01.01.1700, что и делает new Date()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы