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时间的主要内容,如果未能解决你的问题,请参考以下文章