Difference between two dates in years, months, days in JavaScript

前端 未结 26 2989
执念已碎
执念已碎 2020-11-22 07:18

I\'ve been searching for 4 hours now, and have not found a solution to get the difference between two dates in years, months, and days in JavaScript, like: 10th of April 201

26条回答
  •  再見小時候
    2020-11-22 07:58

    Very old thread, I know, but here's my contribution, as the thread is not solved yet.

    It takes leap years into consideration and does not asume any fixed number of days per month or year.

    It might be flawed in border cases as I haven't tested it thoroughly, but it works for all the dates provided in the original question, thus I'm confident.

    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));
    
        if (result && !isNaN(result.years)) {
          document.getElementById('result').innerHTML =
            result.years + ' year' + (result.years == 1 ? ' ' : 's ') +
            result.months + ' month' + (result.months == 1 ? ' ' : 's ') + 'and ' +
            result.days + ' day' + (result.days == 1 ? '' : 's');
        }
      } 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();
    
      // We calculate February based on end year as it might be a leep year which might influence the number of days.
      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;
    
      // (12 + ...) % 12 makes sure index is always between 0 and 11
      var days = startDay <= endDay ? endDay - startDay : daysOfMonth[(12 + endMonth - 1) % 12] - startDay + endDay;
    
      return {
        years: years,
        months: months,
        days: days
      };
    }

提交回复
热议问题