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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了new Date()返回相对时间而不是UTC时间相关的知识,希望对你有一定的参考价值。

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

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

我认为它会返回UTC时间。

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

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

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

我在这做错了什么?

答案

尝试使用

var d = new Date();
var n = d.toUTCString();
console.log(n)
另一答案

当您使用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的特定偏移量,则您的字符串可能会以不同的方式进行解析。

以上是关于new Date()返回相对时间而不是UTC时间的主要内容,如果未能解决你的问题,请参考以下文章

JS Time与Date

MonogoDB----Date()

“Java Date() 以 UTC 形式返回日期”——它实际上是啥意思?

JavaScript—Date对象详情

Date类型之继承方法

从端点调用时,Spring Boot 获取 UTC+1 而不是 GMT