gpt4 book ai didi

Javascript 时间跨度未返回预期结果

转载 作者:行者123 更新时间:2023-11-28 18:58:05 25 4
gpt4 key购买 nike

我使用此代码来获取两个日期之间的时间跨度/耗时

var timein = new Date(year, month, day, tihh1, timm1, 0);
var timeout = new Date(year, month, day, tohh1, tomm1, 0);

var diff = timeout.getTime() - timein.getTime();
var timespan = new Date(diff);

totalHH = parseInt(totalHH) + parseInt(timespan.getUTCHours());
totalMM = parseInt(totalMM) + parseInt(timespan.getUTCMinutes());

此代码有效,但当时间稍后超时时,它不会返回负结果。

示例:

var timein = new Date(2015, 10, 19, 9, 0, 0); // Oct 19 2015 9:00:00
var timeout = new Date(2015, 10, 19, 8, 0, 0); // Oct 19 2015 8:00:00

// Oct 19 2015 8:00:00 - Oct 19 2015 9:00:00

预期结果:-1(小时)

实际结果:23(小时)

最佳答案

此代码按预期工作。

原因

减法后,diff 将等于 -3600000,并且 timespan 将使用该值进行初始化。

new Date(value) 构造函数创建一个 Date 对象,该对象等于 Unix 纪元开始 (01/01/1970 00:00:00 UTC) 加上 毫秒。由于在我们的例子中 value 为负数,new Date(-3600000) 将被评估为 31/12/1969 23:00:00 UTC (Unix 纪元前一小时)。

现在,您应用 timespan.getUTCHours(),它等于 23。

解决方案

在我看来,这种情况下最简单的方法是使用简单的数学而不是 Date 对象,因为它不应该以这种方式工作。

例如,在您的情况下,日期 01 Jan 2015 00:00:0003 Jan 2015 00:00:00 的结果将为 0 而正确答案是 48 小时。

只需根据算术计算值,如下所示:

function writeHHMM(timein, timeout)
{
var totalMinutes = (timeout - timein) / 60000;

var totalHH = Math.floor(totalMinutes / 60); // Math.floor provides integer only values
var totalMM = Math.floor(totalMinutes % 60); // and cuts off seconds

document.body.innerHTML += "<br/> " + totalHH + " hours, " + totalMM + " minutes";
}

writeHHMM(new Date(2015, 10, 19, 9, 0, 0), new Date(2015, 10, 19, 8, 0, 0));
writeHHMM(new Date(2015, 10, 19, 9, 0, 0), new Date(2015, 10, 21, 9, 0, 0));
writeHHMM(new Date(2015, 10, 19, 9, 0, 0), new Date(2014, 7, 3, 5, 15, 13));

关于Javascript 时间跨度未返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33210697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com