Difference in Months between two dates in JavaScript

后端 未结 26 2577
南方客
南方客 2020-11-22 17:06

How would I work out the difference for two Date() objects in JavaScript, while only return the number of months in the difference?

Any help would be great :)

相关标签:
26条回答
  • 2020-11-22 17:43

    Sometimes you may want to get just the quantity of the months between two dates totally ignoring the day part. So for instance, if you had two dates- 2013/06/21 and 2013/10/18- and you only cared about the 2013/06 and 2013/10 parts, here are the scenarios and possible solutions:

    var date1=new Date(2013,5,21);//Remember, months are 0 based in JS
    var date2=new Date(2013,9,18);
    var year1=date1.getFullYear();
    var year2=date2.getFullYear();
    var month1=date1.getMonth();
    var month2=date2.getMonth();
    if(month1===0){ //Have to take into account
      month1++;
      month2++;
    }
    var numberOfMonths; 
    

    1.If you want just the number of the months between the two dates excluding both month1 and month2

    numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;
    

    2.If you want to include either of the months

    numberOfMonths = (year2 - year1) * 12 + (month2 - month1);
    

    3.If you want to include both of the months

    numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;
    
    0 讨论(0)
  • 2020-11-22 17:43

    This should work fine:

    function monthDiff(d1, d2) {
        var months;
        months = (d2.getFullYear() - d1.getFullYear()) * 12;
        months += d2.getMonth() - d1.getMonth();
        return months;
    }
    
    0 讨论(0)
  • 2020-11-22 17:44

    Consider each date in terms of months, then subtract to find the difference.

    var past_date = new Date('11/1/2014');
    var current_date = new Date();
    
    var difference = (current_date.getFullYear()*12 + current_date.getMonth()) - (past_date.getFullYear()*12 + past_date.getMonth());
    

    This will get you the difference of months between the two dates, ignoring the days.

    0 讨论(0)
  • 2020-11-22 17:45
    function monthDiff(date1, date2, countDays) {
    
      countDays = (typeof countDays !== 'undefined') ?  countDays : false;
    
      if (!date1 || !date2) {
        return 0;
      }
    
      let bigDate = date1;
      let smallDate = date2;
    
      if (date1 < date2) {
        bigDate = date2;
        smallDate = date1;
      }
    
      let monthsCount = (bigDate.getFullYear() - smallDate.getFullYear()) * 12 + (bigDate.getMonth() - smallDate.getMonth());
    
      if (countDays && bigDate.getDate() < smallDate.getDate()) {
        --monthsCount;
      }
    
      return monthsCount;
    }
    
    0 讨论(0)
  • 2020-11-22 17:48

    Here's a function that accurately provides the number of months between 2 dates.
    The default behavior only counts whole months, e.g. 3 months and 1 day will result in a difference of 3 months. You can prevent this by setting the roundUpFractionalMonths param as true, so a 3 month and 1 day difference will be returned as 4 months.

    The accepted answer above (T.J. Crowder's answer) isn't accurate, it returns wrong values sometimes.

    For example, monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015')) returns 0 which is obviously wrong. The correct difference is either 1 whole month or 2 months rounded-up.

    Here's the function I wrote:

    function getMonthsBetween(date1,date2,roundUpFractionalMonths)
    {
        //Months will be calculated between start and end dates.
        //Make sure start date is less than end date.
        //But remember if the difference should be negative.
        var startDate=date1;
        var endDate=date2;
        var inverse=false;
        if(date1>date2)
        {
            startDate=date2;
            endDate=date1;
            inverse=true;
        }
    
        //Calculate the differences between the start and end dates
        var yearsDifference=endDate.getFullYear()-startDate.getFullYear();
        var monthsDifference=endDate.getMonth()-startDate.getMonth();
        var daysDifference=endDate.getDate()-startDate.getDate();
    
        var monthCorrection=0;
        //If roundUpFractionalMonths is true, check if an extra month needs to be added from rounding up.
        //The difference is done by ceiling (round up), e.g. 3 months and 1 day will be 4 months.
        if(roundUpFractionalMonths===true && daysDifference>0)
        {
            monthCorrection=1;
        }
        //If the day difference between the 2 months is negative, the last month is not a whole month.
        else if(roundUpFractionalMonths!==true && daysDifference<0)
        {
            monthCorrection=-1;
        }
    
        return (inverse?-1:1)*(yearsDifference*12+monthsDifference+monthCorrection);
    };
    
    0 讨论(0)
  • 2020-11-22 17:53

    You could also consider this solution, this function returns the month difference in integer or number

    Passing the start date as the first or last param, is fault tolerant. Meaning, the function would still return the same value.

    const diffInMonths = (end, start) => {
       var timeDiff = Math.abs(end.getTime() - start.getTime());
       return Math.round(timeDiff / (2e3 * 3600 * 365.25));
    }
    
    const result = diffInMonths(new Date(2015, 3, 28), new Date(2010, 1, 25));
    
    // shows month difference as integer/number
    console.log(result);

    0 讨论(0)
提交回复
热议问题