new Date()返回相对时间而不是UTC时间

时间:2017-12-18 15:18:53

标签: javascript timezone timezone-offset

当我使用我的浏览器开发工具并在控制台中编写新的Date()时,它给了我以下内容

Mon Dec 18 2017 17:11:29 GMT+0200

我认为它会返回UTC时间。

问题是我在AWS上有一个服务器,它将UTC时间写入数据库。它将其写为字符串,在客户端,我执行以下操作

const updatedMilliAgo = new Date() - new Date(timeStrFromDb);

出于某种原因,差异是两个小时,即使我在服务器中写入后立即检查它。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

尝试使用

var d = new Date();
var n = d.toUTCString();
console.log(n)

答案 1 :(得分:1)

使用new Date()时,您正在使用执行代码的系统时钟的当前值构造Date对象。自1970-01-01T00:00:00Z(不考虑闰秒)以来,Date对象内部存储几毫秒。换句话说,Date个对象始终表示UTC时间。

但是 - Date对象上有许多功能和参数可用于本地时间。例如,当您在.toString()对象上调用Date时,计算机的本地时区将应用于基于UTC的内部值,以生成反映当地时间的字符串。

对于console.log - 无法直接记录Date之类的标准对象。相反,大多数实现将记录字符串值。如何创建该值完全是特定于实现的,并且ECMAScript规范定义的。许多实现将返回.toString()返回的相同的基于本地时间的值。某些(例如FireFox)将返回.toISOString()返回的相同UTC值。实现返回存储的实际毫秒数(.valueOf())或其他表示是合理的。如果您需要一致性,请不要只记录Date对象。而是记录其函数之一的输出,该函数返回字符串或数字。

您还询问了减去两个日期对象的问题。这将隐式地在每个对象上调用.valueOf(),减去它们基于UTC的内部值,并给出它们之间的毫秒数。您遇到的最可能的问题是如何构造第二个Date对象。您没有举例说明timeStrFromDb包含的内容,但了解该字符串的格式直接与Date对象的构造方式有关。如果您没有使用标准化格式,或者您不清楚该值是基于UTC还是基于UTC的特定偏移量,则您的字符串可能会以不同的方式进行解析。