【问题标题】:Does JavaScript's Date object automatically handle daylight savings?JavaScript 的 Date 对象会自动处理夏令时吗?
【发布时间】:2017-01-23 19:26:54
【问题描述】:

我正在调查一个涉及将序列化 UTC 日期转换为 JavaScript 日期对象的问题;我已经阅读了一些关于这个主题的问题,但我仍然不清楚。

首先让我说我在英国。如果我以 UTC 纪元 1473805800000 为例,即 Tue, 13 Sep 2016 22:30:00 GMT,则使用该值创建 JavaScript 日期:

var date = new Date(1473805800000);
console.log(date);

控制台日志:

Tue Sep 13 2016 23:30:00 GMT+0100 (GMT Summer Time)

即浏览器已识别出需要为 DST 添加一个额外的小时。

我的问题是,如果我在 10 月 30 日时钟回退之后再次运行相同的代码,我是否仍会得到 23:30 的相同结果,还是会像现在一样是 22:30格林威治标准时间?换句话说,浏览器增加了一个小时是因为主题日期是 DST 还是因为我们目前在 DST?

我无法通过组策略更改我的工作站的系统时钟,否则我会及时跳过它并自己测试。

【问题讨论】:

标签: javascript date dst


【解决方案1】:

Javascript Date 对象使用的时间值是自 1970-01-01T00:00:00Z 以来的偏移量(以毫秒为单位)。它始终是 UTC。

如果为 Date 构造函数提供了单个数字参数,则将其视为 UTC 时间值,因此无论系统时区设置如何,都表示同一时刻。

当您使用console.log(date) 时,会调用内置的toString 方法,该方法会生成一个依赖于实现的字符串,通常使用主机系统的当前时区设置来创建一个方便的、人类可读的字符串。

系统中当前的夏令时规则用于确定用于“本地”时间的偏移量,因此如果日期从夏令时适用的时间更改为不适用的时间,时区偏移量将进行类似的调整(请注意,夏令时偏移并不总是 1 小时)。当前系统偏移量是多少无关紧要,使用的偏移量是基于时间值所代表的日期和时间的设置。

另外,Date 对象非常简单,它们只是一个时间值。时区偏移来自系统设置,它不是 Date 本身的属性。

所以,给定:

我的问题是,如果我要在 30 日之后再次运行相同的代码 十月,时光倒流,我还会一样吗? 23:30 的结果,还是 22:30 和 GMT 一样?

答案是“是”,因为英国夏令时 9 月 13 日适用,现在仍然是 23:30。代码何时运行无关紧要,重要的是该日期的系统偏移设置。

【讨论】:

    【解决方案2】:

    在您的情况下,日期是使用纪元 1473805800000 创建的,并转换为您的时区 GMT+0100。 Epoch 始终是 UTC 时间,因此它被读取为 UTC 并转换为您当前的时区。

    2016 年 9 月 13 日,GMT+01 为夏令时,因此在微积分中考虑。

    在我的情况下,我得到以下内容,运行与您相同的代码:

    Thu Sep 15 2016 14:13:14 GMT-0300 (E. South America Standard Time)
    

    【讨论】:

    • 一个纪元是用于相对测量的基准。对于 ECMAScript 时间值,纪元是 1970-01-01T00:00:00Z。如果用作时间值,则数字 1473805800000 是相对于表示 2016-09-13T22:30:00.000Z 的纪元的偏移量(以毫秒为单位)。
    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 2017-03-17
    • 2019-12-16
    • 2011-04-30
    • 2013-03-18
    • 2017-11-10
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多