首页 > 解决方案 > JavaScript setMinutes() 在 DST 结束时表现错误

问题描述

当美国夏令时结束时,我们将时钟拨回 1 小时,这使得当天凌晨 1 点发生两次。然而,JavaScript 在第二个凌晨 1 小时(时钟切换后)的时间戳表现异常,并不断将它们恢复到 1 小时前的白天时间。这可以在尝试使用setMinutessetHours方法时看到。

此代码将日期的分钟设置为其当前分钟值,并按预期运行(浏览器具America/Los_Angeles有时区):

let date = new Date("2021-07-07T09:40:00.000Z");

console.log(date.toLocaleString("en-us", {timeZoneName: "short"}));
// "7/7/2021, 2:40:00 AM PDT"

date.setMinutes(date.getMinutes());

console.log(date.toLocaleString("en-us", {timeZoneName: "short"}));
// "7/7/2021, 2:40:00 AM PDT"

但是这段代码没有:

let date = new Date("2021-11-07T09:50:00.000Z"); // DST ended on Nov 7 at 2 AM

console.log(date.toLocaleString("en-us", {timeZoneName: "short"}));
// "11/7/2021, 1:50:00 AM PST"

date.setMinutes(date.getMinutes());

console.log(date.toLocaleString("en-us", {timeZoneName: "short"}));
// "11/7/2021, 1:50:00 AM PDT" <-- Wrong time zone

因此 Date 对象可以在第二个(标准时间)小时内正确打印时间戳,但在使用setMinutes().

这是预期的行为吗?date.setMinutes(date.getMinutes())更改日期似乎很奇怪。

标签: javascriptdatedst

解决方案


推荐阅读