JavaScript中日期之间的差异

80

如何找到两个日期之间的差异?


8个回答

122

可以通过使用Date对象及其毫秒值来计算差异:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.
var d = (b-a); // Difference in milliseconds.

通过将毫秒数除以1000转换为秒,然后将结果转换为整数(这会移除表示毫秒的小数部分),您可以获取秒数(作为一个整数/整数):

var seconds = parseInt((b-a)/1000);

你可以通过将seconds除以60并将结果转换为整数,得到整个的minutes,然后通过将minutes除以60并将结果转换为整数,得到hours,以此类推得到更长时间单位。从此,可以创建一个函数来获取较低单位值中最大整数部分所包含的较高单位值和剩余较低单位值:

function get_whole_values(base_value, time_fractions) {
    time_data = [base_value];
    for (i = 0; i < time_fractions.length; i++) {
        time_data.push(parseInt(time_data[i]/time_fractions[i]));
        time_data[i] = time_data[i] % time_fractions[i];
    }; return time_data;
};
// Input parameters below: base value of 72000 milliseconds, time fractions are
// 1000 (amount of milliseconds in a second) and 60 (amount of seconds in a minute). 
console.log(get_whole_values(72000, [1000, 60]));
// -> [0,12,1] # 0 whole milliseconds, 12 whole seconds, 1 whole minute.

如果你想知道上述第二个Date对象的输入参数是什么,请看下面的名称:

new Date(<year>, <month>, <day>, <hours>, <minutes>, <seconds>, <milliseconds>);

如此解决方案的评论中所指出的,除非这些值对于你所希望表示的日期是必需的,否则你不一定需要提供所有这些值。


10
你不需要使用所有参数来调用 Date 构造函数,只需要传入年份和月份即可,其他参数是可选的。 - Christian C. Salvadó
6
谢谢,CMS。我想确保用户明白他们可以非常详细地说明需求。 - Sampson
2
我已经更新了解决方案以传达您的观点,CMS。感谢您提供信息。 - Sampson
1
不用客气,Jonathan。感谢你的编辑……还要注意一下,b 其实是 2009-12-31,因为使用了 0 作为日期参数,这可能会让新手感到困惑…… - Christian C. Salvadó
1
啊,好眼力,CMS。如果我没记错的话,月份是从零开始计算的。确实有点令人困惑。 - Sampson
显示剩余4条评论

4

我已经找到了这个方法,它对我很有效:

计算两个已知日期之间的差异

不幸的是,计算两个已知日期之间的天数、周数或月数等时间间隔并不容易,因为您不能仅仅将Date对象相加。为了在任何计算中使用Date对象,我们必须首先检索存储为大整数的Date的内部毫秒值。执行此操作的函数是Date.getTime()。一旦两个日期都被转换,从后一个日期减去前一个日期将返回以毫秒为单位的差异。然后可以通过将该数字除以相应的毫秒数来确定所需的时间间隔。例如,要获取给定毫秒数的天数,我们将其除以86,400,000,即一天中的毫秒数(1000 x 60秒x 60分钟x 24小时):

Date.daysBetween = function( date1, date2 ) {
  //Get 1 day in milliseconds
  var one_day=1000*60*60*24;

  // Convert both dates to milliseconds
  var date1_ms = date1.getTime();
  var date2_ms = date2.getTime();

  // Calculate the difference in milliseconds
  var difference_ms = date2_ms - date1_ms;

  // Convert back to days and return
  return Math.round(difference_ms/one_day); 
}

//Set the two dates
var y2k  = new Date(2000, 0, 1); 
var Jan1st2010 = new Date(y2k.getFullYear() + 10, y2k.getMonth(), y2k.getDate());
var today= new Date();
//displays 726
console.log( 'Days since ' 
           + Jan1st2010.toLocaleDateString() + ': ' 
           + Date.daysBetween(Jan1st2010, today));

四舍五入是可选的,这取决于您是否需要部分天数。
参考来源: 链接

4
如果您想要以年、月和日的组合形式表示差异,我建议使用以下函数:

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)));

这个解决方案会以我们自然的方式处理闰年(2月29日)和月份长度差异(我认为)。

例如,2015年2月28日至2015年3月28日之间的间隔将被视为一个月,而不是28天。如果这两天都在2016年,差异仍将是一个月,而不是29天。

具有完全相同月份和日期但不同年份的日期将始终具有确切年数的差异。因此,2015-03-01和2016-03-01之间的差异将确切为1年,而不是1年零1天(因为将365天计算为1年)。


3
    // This is for first date
    first = new Date(2010, 03, 08, 15, 30, 10); // Get the first date epoch object
    document.write((first.getTime())/1000); // get the actual epoch values
    second = new Date(2012, 03, 08, 15, 30, 10); // Get the second date epoch object
    document.write((second.getTime())/1000); // get the actual epoch values
    diff= second - first ;
    one_day_epoch = 24*60*60 ;  // calculating one epoch
    if ( diff/ one_day_epoch > 365 ) // check if it is exceeding regular calendar year
    {
    alert( 'date is exceeding one year');
    }

2

这篇答案是基于另一篇文章(链接在结尾处)的,主要讲述了两个日期之间的差异。
你可以看到它是如何工作的,因为它很简单,还包括将差异分割成时间单位(我制作的一个函数)并转换为UTC以避免时区问题。

function date_units_diff(a, b, unit_amounts) {
    var split_to_whole_units = function (milliseconds, unit_amounts) {
        // unit_amounts = list/array of amounts of milliseconds in a
        // second, seconds in a minute, etc., for example "[1000, 60]".
        time_data = [milliseconds];
        for (i = 0; i < unit_amounts.length; i++) {
            time_data.push(parseInt(time_data[i] / unit_amounts[i]));
            time_data[i] = time_data[i] % unit_amounts[i];
        }; return time_data.reverse();
    }; if (unit_amounts == undefined) {
        unit_amounts = [1000, 60, 60, 24];
    };
    var utc_a = new Date(a.toUTCString());
    var utc_b = new Date(b.toUTCString());
    var diff = (utc_b - utc_a);
    return split_to_whole_units(diff, unit_amounts);
}

// Example of use:
var d = date_units_diff(new Date(2010, 0, 1, 0, 0, 0, 0), new Date()).slice(0,-2);
document.write("In difference: 0 days, 1 hours, 2 minutes.".replace(
   /0|1|2/g, function (x) {return String( d[Number(x)] );} ));

代码的工作原理

可以使用 Date 对象计算日期/时间差,以毫秒为单位:

var a = new Date(); // Current date now.
var b = new Date(2010, 0, 1, 0, 0, 0, 0); // Start of 2010.

var utc_a = new Date(a.toUTCString());
var utc_b = new Date(b.toUTCString());
var diff = (utc_b - utc_a); // The difference as milliseconds.

然后,为了计算这个差异中的秒数,将其除以1000以将毫秒转换为秒,然后将结果更改为整数(整数部分)以删除毫秒(小数部分):var seconds = parseInt(diff/1000)。同样,我可以使用相同的过程获取较长的时间单位,例如:
-(完整的)分钟,将除以60并将结果更改为整数,
- 小时,将分钟除以60并将结果更改为整数。

我创建了一个名为split_to_whole_units的函数来执行将差异拆分为整个时间单位的过程,具体内容请见示例:

console.log(split_to_whole_units(72000, [1000, 60]));
// -> [1,12,0] # 1 (whole) minute, 12 seconds, 0 milliseconds.

本答案基于这个答案

该答案涉及到IT技术相关内容。

注意:此篇与 https://dev59.com/7nRB5IYBdhLWcg3wtZIV#46529159 相同。请勿重复发布。 - Edward

1

你也可以使用它

export function diffDateAndToString(small: Date, big: Date) {


    // To calculate the time difference of two dates 
    const Difference_In_Time = big.getTime() - small.getTime()

    // To calculate the no. of days between two dates 
    const Days = Difference_In_Time / (1000 * 3600 * 24)
    const Mins = Difference_In_Time / (60 * 1000)
    const Hours = Mins / 60

    const diffDate = new Date(Difference_In_Time)

    console.log({ date: small, now: big, diffDate, Difference_In_Days: Days, Difference_In_Mins: Mins, Difference_In_Hours: Hours })

    var result = ''

    if (Mins < 60) {
        result = Mins + 'm'
    } else if (Hours < 24) result = diffDate.getMinutes() + 'h'
    else result = Days + 'd'
    return { result, Days, Mins, Hours }
}

结果为 { result: '30d', Days: 30, Mins: 43200, Hours: 720 }


0
Date.prototype.addDays = function(days) {

   var dat = new Date(this.valueOf())
   dat.setDate(dat.getDate() + days);
   return dat;
}

function getDates(startDate, stopDate) {

  var dateArray = new Array();
  var currentDate = startDate;
  while (currentDate <= stopDate) {
    dateArray.push(currentDate);
    currentDate = currentDate.addDays(1);
  }
  return dateArray;
}

var dateArray = getDates(new Date(), (new Date().addDays(7)));

for (i = 0; i < dateArray.length; i ++ ) {
  //  alert (dateArray[i]);

    date=('0'+dateArray[i].getDate()).slice(-2);
    month=('0' +(dateArray[i].getMonth()+1)).slice(-2);
    year=dateArray[i].getFullYear();
    alert(date+"-"+month+"-"+year );
}

0
var DateDiff = function(type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    var returns = -1;

    switch(type){
        case 'm': case 'mm': case 'month': case 'months':
            returns = ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
            break;
        case 'y': case 'yy': case 'year': case 'years':
            returns = years;
            break;
        case 'd': case 'dd': case 'day': case 'days':
            returns = ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
            break;
    }

    return returns;

}

使用方法
var qtMonths = DateDiff('mm', new Date('2015-05-05'), new Date()); var qtYears = DateDiff('yy', new Date('2015-05-05'), new Date()); var qtDays = DateDiff('dd', new Date('2015-05-05'), new Date());
或者
var qtMonths = DateDiff('m', new Date('2015-05-05'), new Date()); // m || y || d var qtMonths = DateDiff('month', new Date('2015-05-05'), new Date()); // month || year || day var qtMonths = DateDiff('months', new Date('2015-05-05'), new Date()); // months || years || days ...
var DateDiff = function (type, start, end) {

    let // or var
        years = end.getFullYear() - start.getFullYear(),
        monthsStart = start.getMonth(),
        monthsEnd = end.getMonth()
    ;

    if(['m', 'mm', 'month', 'months'].includes(type)/*ES6*/)
        return ( ( ( years * 12 ) - ( 12 - monthsEnd ) ) + ( 12 - monthsStart ) );
    else if(['y', 'yy', 'year', 'years'].includes(type))
        return years;
    else if (['d', 'dd', 'day', 'days'].indexOf(type) !== -1/*EARLIER JAVASCRIPT VERSIONS*/)
        return ( ( end - start ) / ( 1000 * 60 * 60 * 24 ) );
    else
        return -1;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接