【问题标题】:Understanding JavaScript dates in British Summer Time了解英国夏令时的 JavaScript 日期
【发布时间】:2020-08-14 08:31:32
【问题描述】:

我住在英国。如果我为 6 月 1 日创建一个日期对象,我会期望 .getUTCDate() 将月份中的“正确”日期返回为 1,但它会返回 31.getDate(),我认为这是为了返回语言环境日期返回1

new Date(2020,5,1).getUTCDate() // 31
new Date(2020,5,1).getDate(); // 1

这是为什么?是因为new Date(2020,5,1) 已经转换为当地时间还是什么?我认为日期是通用存储的,只有在打印出日期时才应用语言环境规则?我已经阅读了所有的 MDN 文档,但仍然不明白,如果有人可以按照上述步骤返回 311,我将不胜感激。

【问题讨论】:

  • 您回答了自己的问题。默认情况下,除非您指定 UTC,否则日期由您的本地计算机决定。看这里google.com/…
  • @full-stack 但是如果“日期对象的内部表示是单个数字,表示自 1970-01-01 00:00:00 UTC 以来经过的毫秒数”,当然new Date(2020,5,1) 应该是 2020 年 6 月 1 日 UTC,new Date(2020,5,1).getUTCDate() 应该是 1。我不明白 BST 在什么时候进入组合并导致它改为 31。
  • 见这里:“当使用Date对象的各种功能时,计算机的本地时区应用于内部表示”stackoverflow.com/questions/15141762/…
  • 似乎new Date(2020,5,1) 将按预期将日期存储为UTC,但是当您调用.getUTCDate().getDate() 时,日期将被视为实际存储为本地时间并且是首先从本地时间(在 BST 中提前 1 小时)转换回 UTC(所以返回 1 小时),然后 .getUTCDate 将返回此日期,.getDate 将转换为“返回本地”,因此添加一个第一个小时,按预期将我们带回到最初的 2020 年 6 月 1 日。这是正确的吗?

标签: javascript date


【解决方案1】:

简要说明 ECMAScript Date 构造函数的工作原理。

单个字符串值以奇怪而奇妙的方式被解析并转换为日期,这些方式主要取决于实现,见下文。因此,以下所有内容都忽略了解析并假设 Date 构造函数被调用时至少带有两个参数,即年和月。在这种情况下,字符串值被转换为数字,就像 Number(value) 一样。

所有非 UTC 方法都在本地时间工作,即基于主机系统日期、时间和时区偏移设置。当使用构造函数和年、月、日等的值创建 Date 对象时,任何缺失的值都将被视为 0,但默认为 1 的日除外。

所以

new Date(2020, 5, 1)

根据该日期和时间的日期、时间和时区偏移的主机(本地)设置创建日期,尊重夏令时和其他调整(常见于 1900 年之前)等历史变化,就像通过:

new Date(2020, 5, 1, 0, 0, 0, 0); // Local 1 Jun 2020 00:00:00.000

所以 getUTCDate 对于时区偏移量小于零的系统返回 31(即 5 月 31 日),对于任何偏移量为零或更大的系统返回 1(即 6 月 1 日)。常用的最大正偏移量是+14,最小的是-10。

如果你想根据 UTC 值创建一个 Date,那么使用 Date.UTC 方法,它返回一个数字,时间值,所以你必须将它传递给 Date 构造函数来创建一个 Date 对象:

new Date(Date.UTC(2020, 5, 1)).getUTCDate(); // 1 regardless of host settings

解析字符串:new Date(string)Date.parse(string)

这是 Date 对象崩溃和烧毁的地方。虽然构造函数主要使用本地,但即使未指定 UTC,它也可以使用 UTC。除了 ECMA-262 支持的 3 种格式之外,字符串的解析几乎完全依赖于实现。即使是支持的格式也不会在实现之间进行一致的解析,因此一般建议是不要使用内置解析器。见Why does Date.parse give incorrect results?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2014-05-12
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多