Difference between dates in JavaScript

后端 未结 8 2224
渐次进展
渐次进展 2020-11-22 13:22

How to find the difference between two dates?

8条回答
  •  南笙
    南笙 (楼主)
    2020-11-22 13:43

    If you are looking for a difference expressed as a combination of years, months, and days, I would suggest this function:

    function interval(date1, date2) {
        if (date1 > date2) { // swap
            var result = interval(date2, date1);
            result.years  = -result.years;
            result.months = -result.months;
            result.days   = -result.days;
            result.hours  = -result.hours;
            return result;
        }
        result = {
            years:  date2.getYear()  - date1.getYear(),
            months: date2.getMonth() - date1.getMonth(),
            days:   date2.getDate()  - date1.getDate(),
            hours:  date2.getHours() - date1.getHours()
        };
        if (result.hours < 0) {
            result.days--;
            result.hours += 24;
        }
        if (result.days < 0) {
            result.months--;
            // days = days left in date1's month, 
            //   plus days that have passed in date2's month
            var copy1 = new Date(date1.getTime());
            copy1.setDate(32);
            result.days = 32-date1.getDate()-copy1.getDate()+date2.getDate();
        }
        if (result.months < 0) {
            result.years--;
            result.months+=12;
        }
        return result;
    }
    
    // Be aware that the month argument is zero-based (January = 0)
    var date1 = new Date(2015, 4-1, 6);
    var date2 = new Date(2015, 5-1, 9);
    
    document.write(JSON.stringify(interval(date1, date2)));

    This solution will treat leap years (29 February) and month length differences in a way we would naturally do (I think).

    So for example, the interval between 28 February 2015 and 28 March 2015 will be considered exactly one month, not 28 days. If both those days are in 2016, the difference will still be exactly one month, not 29 days.

    Dates with exactly the same month and day, but different year, will always have a difference of an exact number of years. So the difference between 2015-03-01 and 2016-03-01 will be exactly 1 year, not 1 year and 1 day (because of counting 365 days as 1 year).

提交回复
热议问题