JavaScript 的日期对象是否自动处理夏令时?
Does JavaScript's Date object automatically handle daylight savings?
我正在调查涉及将序列化 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 就像格林威治标准时间一样?换句话说,浏览器是否因为主题日期是 DST 或因为我们当前处于 DST 而增加了一个小时?
组策略禁止我更改工作站的系统时钟,否则我会及时跳过它并自己测试。
在您的例子中,日期是使用纪元 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)
Javascript 日期对象使用的时间值是自 1970-01-01T00:00:00Z 以来的毫秒偏移量。始终为 UTC。
如果 Date 构造函数被赋予单个数字参数,它将被视为 UTC 时间值,因此无论系统时区设置如何,它都代表同一时刻。
当你使用 console.log(date)
时,内置的 toString 方法被调用,它生成一个依赖于实现的字符串,通常使用主机系统的当前时区设置创建一个方便的、人类可读的字符串。
系统中当前的夏令时规则用于确定 "local" 时间使用的偏移量,因此如果日期从适用夏令时的时间更改为不适用夏令时的时间,则时区偏移量将进行类似调整(请注意,夏令时偏移量并不总是 1 小时)。当前系统偏移量是多少并不重要,使用的是基于时间值所代表的日期和时间的设置。
此外,日期对象非常简单,它们只是一个时间值。时区偏移来自系统设置,它不是日期本身的属性。
所以,给定:
My question is, if I were to run this same code again after the 30th
October when the clocks have gone back, would I still get the same
result of 23:30, or would it be 22:30 as if it were GMT?
答案是 "yes",它仍然是 23:30,因为英国夏令时 9 月 13 日适用。当代码是 运行 时并不重要,重要的是该日期的系统偏移设置是什么。
我正在调查涉及将序列化 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 就像格林威治标准时间一样?换句话说,浏览器是否因为主题日期是 DST 或因为我们当前处于 DST 而增加了一个小时?
组策略禁止我更改工作站的系统时钟,否则我会及时跳过它并自己测试。
在您的例子中,日期是使用纪元 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)
Javascript 日期对象使用的时间值是自 1970-01-01T00:00:00Z 以来的毫秒偏移量。始终为 UTC。
如果 Date 构造函数被赋予单个数字参数,它将被视为 UTC 时间值,因此无论系统时区设置如何,它都代表同一时刻。
当你使用 console.log(date)
时,内置的 toString 方法被调用,它生成一个依赖于实现的字符串,通常使用主机系统的当前时区设置创建一个方便的、人类可读的字符串。
系统中当前的夏令时规则用于确定 "local" 时间使用的偏移量,因此如果日期从适用夏令时的时间更改为不适用夏令时的时间,则时区偏移量将进行类似调整(请注意,夏令时偏移量并不总是 1 小时)。当前系统偏移量是多少并不重要,使用的是基于时间值所代表的日期和时间的设置。
此外,日期对象非常简单,它们只是一个时间值。时区偏移来自系统设置,它不是日期本身的属性。
所以,给定:
My question is, if I were to run this same code again after the 30th October when the clocks have gone back, would I still get the same result of 23:30, or would it be 22:30 as if it were GMT?
答案是 "yes",它仍然是 23:30,因为英国夏令时 9 月 13 日适用。当代码是 运行 时并不重要,重要的是该日期的系统偏移设置是什么。