как вычислить разницу между датами в javascript учитывая годы — Q&A Хекслет
2026-02-26 20:41 Diff

Ответы

JavaScript предоставляет объект Date, с помощью которого можно легко работать с датами и временными интервалами.

function dateDiff(startDate, endDate) { // Преобразование строковых дат в объект Date const start = new Date(startDate); const end = new Date(endDate); // Получаем разницу в миллисекундах const diffTime = end - start; // Конвертируем миллисекунды в дни const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); // Вычисляем количество лет, месяцев и дней const years = end.getFullYear() - start.getFullYear(); const months = end.getMonth() - start.getMonth(); const days = end.getDate() - start.getDate(); // Корректируем, если разница по месяцам или дням отрицательная let totalYears = years; let totalMonths = months; let totalDays = days; if (totalDays < 0) { totalMonths -= 1; // Получаем количество дней в предыдущем месяце const lastMonth = new Date(end.getFullYear(), end.getMonth(), 0); totalDays += lastMonth.getDate(); } if (totalMonths < 0) { totalYears -= 1; totalMonths += 12; } return { years: totalYears, months: totalMonths, days: totalDays, }; } // Пример использования const difference = dateDiff("2020-01-15", "2023-03-10"); console.log(`${difference.years} года, ${difference.months} месяца, ${difference.days} дня`);

Для более сложных операций с датами вы можете использовать специализированные библиотеки, такие как date-fns или Moment.js (хотя Moment.js считается устаревшей библиотекой и не рекомендуется для новых проектов).

Пример с date-fns:

import { differenceInYears, differenceInMonths, differenceInDays } from 'date-fns'; const startDate = new Date("2020-01-15"); const endDate = new Date("2023-03-10"); const years = differenceInYears(endDate, startDate); const months = differenceInMonths(endDate, startDate) % 12; // остаток от деления на 12 для месяцев const days = differenceInDays(endDate, startDate) - (years * 365 + months * 30); // упрощенная формула console.log(`${years} года, ${months} месяца, ${days} дня`);