Как да получите пълни месеци между две дати в javascript

Здравейте, как мога да получа пълните месеци между две дати в javascript? Успях да получа пълните дни, години-месеци-дни и седмици-дни, но как да получа пълните месеци, които продължават след 12? Например 13 месеца и 5 дни или 25 месеца и 1 ден. Просто имам нужда от раздела за месеца, който е абзац с id fmonths. Понякога се забавя с 1 месец може би поради високосна година или нещо подобно. Правилни ли са и другите изчисления?

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>


person stanislav    schedule 08.10.2018    source източник
comment
защо просто не го тествате, за да видите дали изчисленията са правилни, изглежда, че получаването на месеци е същото нещо - повече математика. Или искате да получите точните месеци, а не стойността в месеци?   -  person whiraj    schedule 08.10.2018
comment
Тествах и изглежда, че всички работят с изключение на месеца, който понякога е отклонен с един месец. Например от 14/6/2000 до 20/1/2016 е 187 месеца, 6 дни, което е правилно, но от 14/6/1946 до утре е 868, но трябва да е 867. Искам точните месеци, които са минали от един ден   -  person stanislav    schedule 08.10.2018


Отговори (1)


Можете да използвате нещо подобно:

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>

person Luis Alves    schedule 08.10.2018