Почему так происходит, и как такое можно решить?
Потому что объект 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