как вычислить разницу между датами в javascript учитывая годы

Аватар пользователя Ivan Gagarinov
Ivan Gagarinov
22 декабря 2024

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} дня`);
0 0
Познакомьтесь с основами JavaScript бесплатно