【问题标题】:new Date() returns relative time and not UTC timenew Date() 返回相对时间而不是 UTC 时间
【发布时间】:2017-12-18 15:18:53
【问题描述】:

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

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

我认为它应该返回 UTC 时间。

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

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

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

我在这里做错了什么?

【问题讨论】:

标签: javascript timezone timezone-offset


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    尝试使用

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

    【讨论】:

    • 什么是日期?我该如何定义它?控制台中的 Date.UTC() 给了我 NaN
    • 我试过了,但我不能这样做 const updatedMilliAgo = new Date().toUTCString() - new Date(timeStrFromDb) 因为一个是字符串,另一个是日期对象
    【解决方案3】:

    我迟到了,但我没有找到答案,我不得不与代码斗争几个小时......最后我的解决方案就这么简单:

            TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of("UTC"));
            timeZone.setDefault(timeZone);
    

    当您设置默认时区时,您创建的所有日期都将在您指定的 ZoneId 中。

    我希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多