如何获得 JavaScript 中两个日期之间的差异?

IT技术 javascript date
2021-01-30 16:58:40

我正在创建一个应用程序,它可以让您定义具有时间范围的事件。我想在用户选择或更改开始日期时自动填写结束日期。但是,我无法弄清楚如何获得两次之间的差异,然后如何使用该差异创建新的结束日期。

6个回答

在 JavaScript 中,可以通过调用该getTime()方法仅在数字表达式中使用日期将日期转换为自 epoc 以来的毫秒数。

所以要得到差异,只需减去两个日期。

要根据差异创建新日期,只需在构造函数中传递毫秒数。

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

这应该只是工作

编辑:修正了@bdukes 指出的错误

编辑

对于行为的解释oldBeginoldEnd、 和newBeginDate实例。调用操作符+-会触发 Javascript 自动转换,并会自动调用valueOf()这些对象原型方法。碰巧该valueOf()方法在Date对象中实现为对 的调用getTime()

所以基本上: date.getTime() === date.valueOf() === (0 + date) === (+date)

对于JS中的日期解析,我建议你看看这个问题:stackoverflow.com/questions/1576753/...
2021-03-14 16:58:40
.getTime() 工作所需的格式是什么......例如 - new Date('22-12-2012 00:00').getTime() 将不起作用......有任何想法吗?
2021-03-23 16:58:40
添加数字和天数时要小心。请参阅下面的我的答案以获取解释
2021-03-28 16:58:40
此外,还有一个函数可用于在 JavaScript 中添加或减去日期:stackoverflow.com/a/1214753/975097
2021-04-03 16:58:40
OldBegin、oldEnd 和 NewBegin 应该是Date对象吗?很难说它们应该是什么类型的对象,因为这里省略了变量声明。
2021-04-06 16:58:40

JavaScript 完美支持开箱即用的日期差异

https://jsfiddle.net/b9chris/v5twbe3h/

var msMinute = 60*1000, 
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between'); // 364
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between'); // 0

现在有些陷阱。试试这个:

console.log(a - 10); // 1331614798990
console.log(a + 10); // mixed string

因此,如果您有添加数字和日期的风险,请number直接将日期转换为

console.log(a.getTime() - 10); // 1331614798990
console.log(a.getTime() + 10); // 1331614799010

我的第一个例子展示了 Date 对象的力量,但它实际上似乎是一个定时炸弹

“陷阱”实际上是基于语言规范的默认值。减法运算符-将参数强制为 number,因此 Date 返回其时间值。+操作符被重载,所以可能会做加法,强迫数或级联。由于在这种情况下日期强制为字符串,因此+会进行连接。混乱不是 Date 对象的错,而是运算符重载的错。
2021-03-12 16:58:40
我在编辑中添加了一个 jsfiddle 和上述代码行的结果。我还包括了一种以 NaN 结束的快速方法:b + 60000 - a
2021-03-12 16:58:40
丹,我发现你的例子最容易理解和遵循。谢谢。
2021-03-21 16:58:40

见 JsFiddle 演示

    var date1 = new Date();    
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

为您的 HTML 代码:

<div id="showTime"></div>
并非所有遵守夏令时的日子都是 24 小时。使用内置解析器来解析不受支持的字符串格式并不是创建日期的好方法。
2021-04-01 16:58:40

如果您不关心时间部分,您可以使用.getDate().setDate()来设置日期部分。

因此,要将结束日期设置为开始日期后 2 周,请执行以下操作:

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

要返回两个日期之间的差异(以天为单位),请执行以下操作:

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

最后,让我们修改第一个函数,使其可以将 2nd 返回的值作为参数:

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}
var ds = new Date(2014, 0, 31, 0, 0, 0, 0); var de = new Date(2014, 2, 31, 0, 0, 0, 0); GetDateDiff(ds,de) 返回 0
2021-04-02 16:58:40
GetDateDiff()将突破月壁垒。例如,2011/04/26 和 2011/05/01 将返回 -25,但偏移量应为 5 天。
2021-04-07 16:58:40

谢谢@ Vincent Robert,我最终使用了您的基本示例,尽管它实际上是newBegin + oldEnd - oldBegin. 这是简化的最终解决方案:

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }
最好解释一下为什么有时使用getTime有时不使用
2021-03-11 16:58:40