【问题标题】:Why JavaScript displays date and time in local time zone?为什么 JavaScript 在本地时区显示日期和时间?
【发布时间】:2021-09-25 08:21:05
【问题描述】:

我正在查看 MDN 的引用:

注意:重要的是要记住,虽然 Date 对象的核心是 UTC,它是获取日期和 时间或其组件都在本地(即主机系统)时间工作 区域和偏移量。

如果 JavaScript Date 对象默认以 UTC 存储时间,那么它如何以 local time 显示时间区域。 它是在内部将其转换为本地时区还是什么?

【问题讨论】:

  • JavaScript 是客户端脚本语言,因此当您在 javascript 中创建 new Date() 时,它会占用客户端机器时间
  • 该评论不正确,时间值不是 UTC 或任何其他时区,它只是毫秒数,在地球上的每个点都是相同的。当您将该值格式化为人类可读的时间字符串时,时区拳头就会发挥作用。
  • @georg 这是自 01.01.1970 00:00:00.0 UTC 以来的毫秒数
  • @georg — 本地偏移量用于所有 Date 构造和方法,而不是指定时区或 UTC(例如 UTC 方法或使用偏移量解析字符串)或推断(例如 new Date(number)其中 number 被假定为时间值,即从 ECMAScript 纪元的偏移量)。 :-)

标签: javascript date time


【解决方案1】:

虽然它是一个非常有用的资源,但 MDN 并不规范。这是一个任何人都可以修改的公共维基。规范性文档为ECMA-262(目前为 ECMA-262 ed 12 或 ECMAScript 2021),每年 6 月发布新版本。 current draft 将成为 ECMASCript 2022。

ECMA-262 中对 Date objects work 的详细说明,MDN 是一个更易于理解的摘要。与所有摘要一样,它不包含标准中的所有信息,并且某些解释并不准确。

ECMASCript 日期包含单个数据值,即一个 时间值,它是自 1970-01-01T00:00:00Z 以来的毫秒数。这就是为什么认为 Date 对象本质上是 UTC 的原因。该值可以存储为 ISO 8601 格式的字符串或一组日期和时间值,但时间值是一个很好的公分母,无论如何计算它可能是大多数日期方法的第一步。这是许多编程语言和环境中使用的通用概念。

时间值的计算方式取决于调用时传递给 Date 构造函数的参数数量,对于第一个参数,其类型如Date constructor 部分所述。

如何计算本地时区偏移量取决于实现,如LocalTZA ( t, isUTC ) 部分所述:

LocalTZA( t, isUTC ) 是一种实现定义的算法,它 返回一个表示本地时区的整数 调整或偏移,以毫秒为单位。

这取决于对主机系统区域设置和时间的访问,以及该区域的历史时区偏移更改(早期版本的 ECMASCript 要求将当前设置视为始终有效,这并不理想)。

所以回答这个问题:

如果 JavaScript 日期对象默认以 UTC 存储时间,那么如何 它显示本地时区的时间。它是否在内部转换它 到本地时区还是什么?

由内部 UTC 偏移量(时间值)表示的特定日期和时间的本地时区偏移量应用于确定该特定时刻的本地值。算法都在 ECMA-262 中,如Make TimeMake DayMake Date 等。

【讨论】:

    【解决方案2】:

    在将字符串转换为 javascript 中的日期之前将“UTC”附加到字符串:

    var date = new Date('6/29/2011 4:52:48 PM UTC');
    date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
    

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 2021-05-02
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多