stanislav
stanislav

Reputation: 25

How to get full months between two dates in javascript

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

Answers (1)

Luis Alves
Luis Alves

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

Related Questions