JavaScript's Date对象是否自动处理夏令时?

Does JavaScript's Date object automatically handle daylight savings?

本文关键字:处理 夏令时 是否 对象 Date JavaScript      更新时间:2023-09-26

我正在调查一个涉及将序列化的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)

。浏览器已经识别出需要为夏时制添加一个小时。

我的问题是,如果我在10月30日之后再次运行相同的代码,当时钟返回时,我仍然会得到23:30的相同结果,或者它会是22:30,如果它是GMT?换句话说,浏览器添加一个小时是因为主题日期是夏时制还是因为我们目前处于夏时制?

组策略禁止我更改工作站的系统时钟,否则我将跳过它并亲自测试。

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

如果给Date构造函数一个数字参数,它将被视为UTC时间值,因此无论系统时区设置如何,它都表示同一时刻。

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

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

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

所以,鉴于:

我的问题是,如果我在30号之后再次运行相同的代码当十月的时钟拨回,我还会得到同样的23:30的结果,或者如果是格林尼治时间是22:30 ?

答案是"是",它仍然是23:30,因为9月13日适用英国夏令时。代码何时运行并不重要,重要的是该日期的系统偏移量设置。

在您的示例中,使用epoch 1473805800000创建Date,并将其转换为您的时区GMT+0100。Epoch始终是UTC时间,因此它被读取为UTC并转换为您当前的时区。

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

在我的例子中,运行与您的相同的代码,得到以下结果:

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