【问题标题】:JavaScript Date Difference - one hour too muchJavaScript 日期差异 - 一小时太多了
【发布时间】:2013-08-03 23:20:08
【问题描述】:

我对 JavaScript 很陌生,但我遇到了一个问题。 我有一个 HTMl5 页面,其中包含 2 个 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,还是我没有得到线索? p>

【问题讨论】:

  • to != too,对不起语法巡逻,但我忍不住。
  • 对不起,英语不是我的第一语言。不过,你是对的 - 只是一个错字!

标签: javascript html date


【解决方案1】:

setTime() 需要几毫秒 UTC

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

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

您可以使用 getUTCHours() 获得所需的时间。

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

【讨论】:

  • getUTCHours() 也不起作用,如果时间跨度超过 24 小时或在那个时间附近有闰秒等。问题是Date 只是一个日期而不是时间跨度。
  • @Sebastian 我假设 OP 只在非常特殊的情况下使用它。
  • 阅读 JS 的 API 会很有帮助 :-) 感谢您的建议,非常合乎逻辑。不,这不是为了更长的计算,只是一个小时间跟踪应用程序
  • @sebastian 在这种情况下,时间跨度不允许超过 10
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    我认为 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)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多