减去两个如此接近的日期会产生明显的奇怪行为

时间:2015-09-22 19:08:43

标签: javascript date behavior difference

我正在为我的学校作业实施一个时钟和一个计时器,为了实现计时器,我决定通过减去计时器开始和当前日期之间的日期来创建它,但是当我这样做时,我得到了总是超过预期的小时(0)。

例如,使用Chrome中集成的控制台:

var d1 = new Date();
undefined

var d2 = new Date();
undefined

var diffDate = new Date(d2.getTime() - d1.getTime());
undefined

diffDate.getHours();
1

当然,在创建d2之后,我还没有等待一小时来创建d1

为什么会这样?

我在某些地方搜索过,但没有人解释这种行为。我想我错过了什么。

2 个答案:

答案 0 :(得分:3)

getTime()返回自1970年1月1日以来的毫秒数。计算d2.getTime() - d1.getTime()将返回两个new Date()调用之间的毫秒数。 (如果一个接一个地调用,可能为零)。

new Date(0)将创建一个Date对象,自1990年1月1日00:00 UTC开始经过0毫秒,但是在本地时区而不是UTC。 getHours()只会在当地时区设置中返回给定小时,即您所说的“1”。我猜你是GMT +1(英格兰东部)。它与时差无关。

你真的需要用毫秒差异来做一些数学运算,而不是用new Date()

创建一个新的时间点

答案 1 :(得分:2)

您的时区正在影响您的约会。我的浏览器中的默认时区是GMT + 530,这是我得到的结果:

var d1 = new Date();
console.log(d1);
// Wed Sep 23 2015 00:54:08 GMT+0530 (IST)

var d2 = new Date();
console.log(d2);
// Wed Sep 23 2015 00:54:21 GMT+0530 (IST)


/*
 * Here, diffDate should be (and is!) Thu Jan 01 1970 00:00:00 GMT+000.
 * In the local timezone of my browser, it becomes Thu Jan 01 1970 05:30:13 GMT+0530 (IST)
 */
var diffDate = new Date(d2.getTime() - d1.getTime());
console.log(diffDate);
// Thu Jan 01 1970 05:30:13 GMT+0530 (IST)

console.log(diffDate.getHours());
// 5

console.log(diffDate.getUTCHours());
// 0

getUTCHours()绕过时区,并以UTC格式返回小时数。 diffDate.getUTCHours()应打印0