JavaScript 中日期之间的差异

IT技术 javascript datetime datediff
2021-01-27 16:13:19

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

6个回答

通过使用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);

然后,您可以minutes通过除以seconds60 并将其转换为整数来获得整数,然后hours通过除以minutes60 并将其转换为整数,然后以相同的方式获得更长的时间单位。由此,可以创建一个函数,以在较低单位的值和剩余较低单位的值中获取时间单位的最大总量:

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

正如此解决方案的评论中所指出的,您不一定需要提供所有这些值,除非您希望表示的日期需要它们。

我已经更新了解决方案来传达您的观点,CMS。我很欣赏单挑。
2021-03-18 16:13:19
您不需要Date使用所有参数调用构造函数,您可以只使用 Year 和 Month 调用它,其他参数是可选的。
2021-03-25 16:13:19
啊,好眼力,CMS。如果我没记错的话,月份是从零开始的。确实有点混乱。
2021-03-30 16:13:19
不客气,乔纳森,感谢您的编辑...还要注意,b实际上是 2009 年 12 月 31 日,因为 a0被用作日期参数,所以新人可能会以某种方式混淆...
2021-04-02 16:13:19
谢谢,内容管理系统。我想确保用户理解他们可以非常详细地了解他们的规范。
2021-04-06 16:13:19

我发现了这个,它对我来说很好用:

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

不幸的是,计算两个已知日期之间的日期间隔(例如天、周或月)并不容易,因为您不能将 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));

四舍五入是可选的,取决于您是否想要部分天数。

参考

    // 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 first 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 , is it exceei
    {
    alert( 'date is exceeding one year');
    }

如果您正在寻找表示为年、月和日组合的差异,我建议使用此函数:

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 年,则差异仍将是 1 个月,而不是 29 天。

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

这个答案基于另一个(链接在最后),是关于两个日期之间的差异。
您可以看到它是如何工作的,因为它很简单,它还包括将差异拆分
为时间单位(我制作的一个函数)并转换为 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)
此外,我可以使用相同的过程获得更长的时间单位,例如:
- (whole) minutes,将除以 60 并将结果更改为整数,
- hours,将分钟除以 60 并将结果更改为整数。

我创建了一个函数,用于执行将差异拆分为
整个时间单位的过程,名为split_to_whole_units,使用此演示:

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

这个答案是基于另一个

注意:其他(此副本)帖子位于stackoverflow.com/questions/542938/...
2021-03-26 16:13:19