2

我对 JavaScript 很陌生,但我遇到了一个问题。我有一个带有 2 个类型的输入元素的 HTMl5-Page 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,或者我在这里没有得到线索?

4

3 回答 3

5

setTime()UTC需要数毫秒。

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

您在打印时看到的“一小时太多”getHours()是您与 UTC 的时间偏移量。

您将使用getUTCHours().

我假设您仅使用此算法来计算hours:minutes小的正日期差异的表示。然后就好了。只是不要尝试将其应用于更大的持续时间计算。

于 2013-08-02T15:47:48.020 回答
2

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

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

如果您将时间设置为 0,您将看到这一点 -getHours()不一定会产生 0。

此外,您将获得环绕效果,因此如果您的时间增量超过 24 小时,您将获得模 24 的值。因此,为了以小时为单位计算两个日期之间的差异,我建议您改用常规数学:

var hours = (diff/(1000*60*60))|0;
于 2013-08-02T15:55:25.410 回答
1

我认为 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)));
于 2013-08-02T15:55:51.440 回答