随后调用具有不同时区的新Date返回对象

时间:2017-10-09 14:11:35

标签: javascript date timezone

我面临一种奇怪的情况,即后续调用传递时间戳的Date构造函数会返回具有不同时区的日期对象。

different timezones subsequent calls same browser

当我使用该对象获取当月的日期时,这会导致问题。

new Date(1509228000000).getDate()
29
new Date(1509314400000).getDate()
29

如果使用相同的时区,结果将是29和30。

我的理解是javascript应该使用系统或浏览器时区。我不明白两个调用是如何一个接一个地返回具有不同时区的对象。

我使用的是Chrome版本61.0.3163.100(官方版本)(64位)。

澄清

我知道时间戳(毫秒数)可以在不同的时区中表示。我不明白的是如何使用不同的值调用Date构造函数会导致在同一台机器和浏览器中具有不同时区的Date对象。

2 个答案:

答案 0 :(得分:2)

在欧盟国家,中欧夏令时(CEST)将于2017年10月29日当地时间凌晨3点过渡到中欧时间(CET)。您的结果只是反映了这种变化。行为是预期的。 Reference here

要清楚,您显示的两个值都是10月29日在当地时区。 getDate()来电的正确结果确实是29。

为了进一步了解,我建议你阅读:

答案 1 :(得分:2)

如果你让我放松整体技术准确性(虽然希望不会说任何明显的错误),我认为如果你认为JavaScript Date对象是一个存储绝对特定时间点的变量,它会更好理解(如果你愿意,可以使用Unix时间戳)。此内部值没有附加时区信息,因为它不是必需的(毕竟它是绝对值)并且它是JavaScript需要的所有内容......直到它必须与外部世界,即解析或生成人类可读的日期。

这些日期总是在当地,因此需要一个时区。 JavaScript创建者使用的方法是使用两个时区:

  • UTC
  • 无论在
  • 运行JavaScript代码的计算机中将哪个时区配置为默认值

有趣的是,选择哪一个取决于所涉及的方法。如果您拨打.getFullYear()即可获得当地时间,如果拨打.getUTCFullYear(),则会获得UTC。还不错,是吗?好吧,你也有.toDateString().toGMTString(),。toISOString() ...你能不知道哪些时区在没有查看文档的情况下使用?甚至在查看文档之后?而且,嘿,日期构造函数实际上可以使用两个,具体取决于字符串和浏览器!

说,更容易理解您的两个代码示例指向非常具体的时刻。当您拨打.getDate()时会发生魔术,预计会使用当地时间。你的电脑显然位于欧洲的某个地方。根据大多数地方法规,在几个月内实施的夏令时及其技术实施的方式是通过实际在两个相关的不同时区之间切换:CET(中欧时间)和CEST(中欧夏令时)。 JavaScript引擎非常智能,可以实现本地时区更改,并能够在存储在对象中的绝对时刻选择正确的时区。

如果您有点好奇,这是可能的,因为浏览器有database with up-to-date time zone transitions。这样的数据库是许多程序共享的宝贵资源。