首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >后续调用具有不同时区的新日期返回对象

后续调用具有不同时区的新日期返回对象
EN

Stack Overflow用户
提问于 2017-10-09 22:11:35
回答 2查看 153关注 0票数 0

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

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

代码语言:javascript
运行
复制
new Date(1509228000000).getDate()
29
new Date(1509314400000).getDate()
29

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

我的理解是javascript应该使用系统时区或浏览器时区。我不明白两个调用,一个接一个,怎么会返回不同时区的对象。

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

澄清

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

EN

回答 2

Stack Overflow用户

发布于 2017-10-10 00:37:56

在欧盟国家,中欧夏季时间(CEST)在当地时间2017年10月29日凌晨3:00转换到今年的中欧时间(CET)。您的结果只是反映了这种变化。这种行为是意料之中的。Reference here

需要说明的是,您显示的两个值都是10月29日的本地时区。getDate()调用的正确结果确实是29。

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

DST article on Wikipedia

  • The

票数 2
EN

Stack Overflow用户

发布于 2017-10-10 00:48:51

如果您允许我放宽总体技术准确性(同时希望不会说任何明显错误的话),我认为如果您将JavaScript Date对象看作一个存储绝对特定时间点的变量(如果您喜欢,它是一个Unix时间戳),那么它更容易理解。这个内部值没有附加时区信息,因为它不是必需的(毕竟是绝对值),它是JavaScript需要的一切……直到它必须与外部世界交互,即解析或生成人类可读的日期。

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

在上运行

  • UTC
  • Whatever代码的计算机中,JavaScript时区被配置为默认时区

有趣的是,选择哪一个取决于所涉及的方法。如果你打电话给.getFullYear(),你会得到当地时间,如果你打电话给.getUTCFullYear(),你会得到世界时。不算太糟,是吧?你还有.toDateString().toGMTString(),.toISOString()..。你能在不看文档的情况下说出每个人使用的时区吗?或者甚至在看完文档之后?而且,嘿,日期构造函数实际上可以同时使用这两种方法,这取决于字符串和浏览器!

话虽如此,更容易理解的是,你的两个代码样本指向非常具体的时刻。当您调用.getDate()时,魔术就会发生,预计它将使用本地时间。您的计算机显然位于欧洲的某个地方。根据大多数当地法规,夏令时在几个月内有效,其技术实施方式实际上是通过在不同时区的两个相关时区之间切换: CET (中欧时间)和CEST (中欧夏季时间)。JavaScript引擎足够智能,能够意识到本地时区的变化,并能够为存储在对象中的绝对时刻选择正确的时区。

如果你很好奇,这是可能的,因为浏览器有一个。这样的数据库是许多程序共享的宝贵资源。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46648509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档