JavaScript日期差异-一个小时太多

JavaScript Date Difference - one hour too much

本文关键字:一个 小时 太多 日期 JavaScript      更新时间:2023-09-26

我对JavaScript还很陌生,但我遇到了一个问题。我有一个HTMl5页面,其中有两个类型为time的输入元素。我想得到这两个时间的差值,这样11:15和12:00会给我0:45。

我认为HTML是非常直接的:

<ul>
    <li>
        <label>Anfang: </label>
    </li>
    <li>
        <input type="time" id="begin" required="true">
    </li>
</ul>
<ul>
    <li>
        <label>Ende: </label>
    </li>
    <li>
        <input type="time" id="end" required="true"></li>
</ul>

我想这里没什么特别的。在我的JavaScript中,我将一个监听器附加到一个按钮上,该按钮获取这两个字段的值,并将其传递给以下函数以创建过时的日期对象:

function timeToDate(input) {
    var hours = input.substring(0, 2);
    var min = input.substring(3, 5);
    var date = new Date();
    date.setHours(hours);
    date.setMinutes(min);
    return date;
}

为了得到区别,我做了:

var beginDate = timeToDate(begin);
var endDate = timeToDate(end);
var diff = endDate.getTime() - beginDate.getTime();
var b = new Date();
b.setTime(diff);
console.log(b.getHours());

所以,但是11:00(beginDate)和12:00(endDate)的控制台输出是2,但它应该是1,或者我在这里没有得到线索?

setTime()需要几毫秒UTC

另一方面,getHours()会打印您当地时区的小时数。

当您打印getHours()时,您看到的"一小时太多"是您与UTC的时间偏移。

使用getUTCHours()可以获得所需的小时数。

我假设你只使用这个算法来计算一个小的正日期差的hours:minutes表示。那就好了。简单地说,不要试图将其应用于更大的持续时间计算。

使用setTime()很容易出错,因为您实际设置的是UTC时间1970年1月1日以来的毫秒数。

使用getHours将在您的时区中生成一天中的时间,这可能与UTC时间不同。

如果您将时间设置为0,就会看到这种情况——getHours()不一定会产生0。

你也会得到环绕效果,所以如果你的时间增量超过24小时,你会得到一个模24的值。因此,为了用小时计算两次约会之间的差异,我建议你使用常规数学:

var hours = (diff/(1000*60*60))|0;

我认为Date对象不能与时间偏移一起使用。代码diff包含两次之间的毫秒数。你可以通过除以60*60*1000得到小时数:

var hours=diff/(60*60*1000);

这可能导致分数,例如15分钟的差异将是0.25小时。如果您需要完整的小时数,您可以使用Math.ceil()Math.floor()向上或向下取整,例如:

console.log("Full hours: "+Math.ceil(diff/(60*60*1000)));