Javascript timespan没有返回预期的结果

时间:2015-10-19 09:14:16

标签: javascript

我正在使用此代码来获取两个日期之间的时间/经过时间

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(小时)

1 个答案:

答案 0 :(得分:3)

此代码按预期工作。

原因

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

new Date(value)构造函数创建一个等于Unix纪元开始(01/01/1970 00:00:00 UTC)加Date毫秒的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小时。

只需计算基于arithemetics的值,如下所示:

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