JSFiddle - React, Tailwind, and code Playground
HTML
Начальная дата: <input type="date" value="2011-12-09" id="from"><br>
Конечная дата: <input type="date" value="2012-12-21" id="to"><br>
<input type="button" value="Рассчитать" onclick="calc()">
<hr>
<div id="result"></div>
JavaScript
// вспомогательная арифметика: число дней в месяце
function daysInMonth(year, month) {
return (new Date(year, month+1, 0).getDate());
}
// основная арифметика здесь
function dateDiff(yearFrom, monthFrom, dateFrom, yearTo, monthTo, dateTo) {
var dY = yearTo - yearFrom,
dm = monthTo - monthFrom,
dd = dateTo - dateFrom;
if (dd < 0) {
dm--;
dd += daysInMonth(yearFrom, monthFrom);
}
if (dm < 0) {
dY--;
dm += 12;
}
return { years: dY, months: dm, days: dd }
}
// вспомогательный русский язык (подбор формы слова к числу)
function numberForm(n, form1, form2, form5) {
if ((n % 100 < 11) || (n % 100 > 15)) {
var lastDigit = n % 10;
if (lastDigit == 1) return form1;
else if (lastDigit > 1 && lastDigit < 5) return form2;
else return form5;
}
else return form5;
}
// расчет и вывод результата
function calc() {
var parts0 = document.getElementById('from').value.split('-'),
parts1 = document.getElementById('to').value.split('-'),
diff, totalMonth, totalDays;
diff = dateDiff(parts0[0], parts0[1]-1, parts0[2],
parts1[0], parts1[1]-1, parts1[2]);
totalMonth = diff.months + diff.years * 12;
totalDays = (Date.UTC(parts1[0], parts1[1]-1, parts1[2]) -
Date.UTC(parts0[0], parts0[1]-1, parts0[2])) / 86400000;
document.getElementById('result').innerHTML = 'Разница дат равна ' +
diff.years + ' ' + numberForm(diff.years, 'год ', 'года ', 'лет ') +
diff.months + ' ' + numberForm(diff.months, 'месяц ', 'месяца ', 'месяцев ') +
diff.days + ' ' + numberForm(diff.days, 'день', 'дня', 'дней') +
', или ' + totalMonth + ' ' + numberForm(totalMonth, 'месяц ', 'месяца ', 'месяцев ') +
diff.days + ' ' + numberForm(diff.days, 'день', 'дня', 'дней') +
', или ' +
totalDays+ ' ' + numberForm(totalDays, 'день', 'дня',...