Reputation: 25
Hi how can i get the full months between two dates in javascript? I managed to get the full days, years-months-days and weeks-days but how do i get the full months which continue after 12? Like 13 months and 5 days or 25 months and 1 day. I just need the month section which is a paragraph with id fmonths. Sometimes is off by 1 month maybe because of leap years or something. Also are the other calculations correct?
function calculate() {
var fromDate = document.getElementById('fromDate').value;
var toDate = document.getElementById('toDate').value;
try {
document.getElementById('result').innerHTML = '';
var result = getDateDifference(new Date(fromDate), new Date(toDate));
} catch (e) {
console.error(e);
}
}
function getDateDifference(startDate, endDate) {
if (startDate > endDate) {
console.error('Start date must be before end date');
return null;
}
var startYear = startDate.getFullYear();
var startMonth = startDate.getMonth();
var startDay = startDate.getDate();
var endYear = endDate.getFullYear();
var endMonth = endDate.getMonth();
var endDay = endDate.getDate();
var february = (endYear % 4 == 0 && endYear % 100 != 0) || endYear % 400 == 0 ? 29 : 28;
var daysOfMonth = [31, february, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var startDateNotPassedInEndYear = (endMonth < startMonth) || endMonth == startMonth && endDay < startDay;
var years = endYear - startYear - (startDateNotPassedInEndYear ? 1 : 0);
var months = (12 + endMonth - startMonth - (endDay < startDay ? 1 : 0)) % 12;
var days = startDay <= endDay ? endDay - startDay : daysOfMonth[(12 + endMonth - 1) % 12] - startDay + endDay;
var diff = endDate - startDate;
var ms = 1000 * 60 * 60 * 24;
var fdays = Math.round(diff / ms);
var weeks = Math.floor(diff / ms / 7);
var wdays = diff / ms % 7;
var fmonths = Math.round(endYear - startYear) * 12 + (endMonth - startMonth);
var fmdays = startDay <= endDay ? endDay - startDay : daysOfMonth[(12 + endMonth - 1) % 12] - startDay + endDay;
document.getElementById('result').innerHTML = fdays + " days or ";
document.getElementById('ymd').innerHTML = years + " years, " + months + " months, " + days + " days or ";
document.getElementById('wd').innerHTML = weeks + " weeks and " + wdays + " days";
document.getElementById('fmonths').innerHTML = fmonths + " months, " + fmdays + " days ";
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.3/semantic.min.css">
<center>
<div class="ui right pointing label">
Start Date
</div>
<div class="ui huge input">
<input type="text" name="fromDate" id="fromDate" placeholder="yyyy-mm-dd" value="2016-1-1" /></div>
<div class="ui right pointing label">
End Date
</div>
<div class="ui huge input">
<input type="text" name="toDate" id="toDate" placeholder="yyyy-mm-dd" value="2017-1-1" />
</div>
<br>
<br>
<button class="ui primary button" input type="button" name="calculate" value="Calculate" onclick="javascript:calculate()">
Calculate
</button>
<p id="result"></p>
<p id="ymd"></p>
<p id="wd"></p>
<p id="fmonths"></p>
Upvotes: 1
Views: 5556
Reputation: 34
You can use something like this:
function monthDiff(d1, d2) {
var months;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
months += d2.getMonth();
return months <= 0 ? 0 : months;
}
var result = monthDiff(
new Date(2008, 10, 4),
new Date(2010, 2, 12)
);
document.getElementById("result").innerHTML = result
<span id="result"></span>
Upvotes: 1