Javascript时间跨度没有返回预期的结果

Javascript timespan not returning expected result

本文关键字:结果 返回 时间跨度 Javascript      更新时间:2023-09-26

我使用这段代码来获取两个日期之间的时间跨度/经过时间

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 (Hour)

实际成绩:23(小时)

代码正常运行

相减后,diff等于-3600000, timespan用此值初始化。

new Date(value)构造函数创建一个Date对象,该对象等于Unix纪元开始(01/01/1970 00:00:00 UTC)加上value毫秒。由于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));