我正面临着一种奇怪的情况,对Date构造函数的后续调用传递了一个时间戳,返回的是具有不同时区的date对象。

当我使用该对象获取月份的日期时,这会导致问题。
new Date(1509228000000).getDate()
29
new Date(1509314400000).getDate()
29如果它使用相同的时区,结果将是29和30。
我的理解是javascript应该使用系统时区或浏览器时区。我不明白两个调用,一个接一个,怎么会返回不同时区的对象。
我使用的是Chrome版本61.0.3163.100 (官方版本)(64位)。
澄清
我知道时间戳(毫秒数)可以用不同的时区表示。我不明白的是,用不同的值调用Date构造函数如何在同一台机器和浏览器中产生具有不同时区的Date对象。
发布于 2017-10-10 00:37:56
在欧盟国家,中欧夏季时间(CEST)在当地时间2017年10月29日凌晨3:00转换到今年的中欧时间(CET)。您的结果只是反映了这种变化。这种行为是意料之中的。Reference here。
需要说明的是,您显示的两个值都是10月29日的本地时区。getDate()调用的正确结果确实是29。
为了进一步理解,我建议您阅读:
dst tag wiki
发布于 2017-10-10 00:48:51
如果您允许我放宽总体技术准确性(同时希望不会说任何明显错误的话),我认为如果您将JavaScript Date对象看作一个存储绝对特定时间点的变量(如果您喜欢,它是一个Unix时间戳),那么它更容易理解。这个内部值没有附加时区信息,因为它不是必需的(毕竟是绝对值),它是JavaScript需要的一切……直到它必须与外部世界交互,即解析或生成人类可读的日期。
这样的日期总是本地的,因此需要一个时区。JavaScript创建者使用的方法是使用两个时区:
在上运行
有趣的是,选择哪一个取决于所涉及的方法。如果你打电话给.getFullYear(),你会得到当地时间,如果你打电话给.getUTCFullYear(),你会得到世界时。不算太糟,是吧?你还有.toDateString(),.toGMTString(),.toISOString()..。你能在不看文档的情况下说出每个人使用的时区吗?或者甚至在看完文档之后?而且,嘿,日期构造函数实际上可以同时使用这两种方法,这取决于字符串和浏览器!
话虽如此,更容易理解的是,你的两个代码样本指向非常具体的时刻。当您调用.getDate()时,魔术就会发生,预计它将使用本地时间。您的计算机显然位于欧洲的某个地方。根据大多数当地法规,夏令时在几个月内有效,其技术实施方式实际上是通过在不同时区的两个相关时区之间切换: CET (中欧时间)和CEST (中欧夏季时间)。JavaScript引擎足够智能,能够意识到本地时区的变化,并能够为存储在对象中的绝对时刻选择正确的时区。
如果你很好奇,这是可能的,因为浏览器有一个。这样的数据库是许多程序共享的宝贵资源。
https://stackoverflow.com/questions/46648509
复制相似问题