我正在使用此代码来获取两个日期之间的时间/经过时间
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(小时)
答案 0 :(得分:3)
此代码按预期工作。
减法后,diff
将等于-3600000
,timespan
将使用此值进行初始化。
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:00
和03 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));