首页 > 解决方案 > JS Date 使用时区时返回错误的日期

问题描述

我在夏令时 (GMT+2) 的 GMT+1 中,使用语言设置为英语(美国)的 MS Edge。从相同日期但不同年份创建新日期会返回不同的语言环境日期字符串。

new Date("1979-09-10T22:00:00.000Z").toLocaleDateString()
// "9/10/1979"

new Date("1980-09-10T22:00:00.000Z").toLocaleDateString()
// "9/11/1980" -> correct day in my case

我猜这些年来使用的语言环境对时区进行了改革。我怎样才能检查这是什么原因?

标签: javascriptdatetime

解决方案


使用wikipedia上的 IANA 数据获取当前具有偏移 +1 和某种 DST 的规范 IANA 代表位置,这些位置未返回“1979-09-10T22:00:00.000Z”和“1980-09-”的预期字符串10T22:00:00.000Z" 返回了以下列表:

  1. 地点:非洲/卡萨布兰卡标准:+01:00 DST:+00:00
  2. 地点:非洲/休达标准:+01:00 DST:+02:00
  3. 地点:非洲/El_Aaiun 标准:+01:00 DST:+00:00
  4. 地点:欧洲/安道尔标准:+01:00 DST:+02:00
  5. 地点:欧洲/贝尔格莱德标准:+01:00 DST:+02:00
  6. 地点:欧洲/都柏林标准:+01:00 DST:+00:00
  7. 地点:欧洲/直布罗陀标准:+01:00 DST:+02:00
  8. 地点:欧洲/苏黎世标准:+01:00 DST:+02:00

在timeanddate.com上快速查看一下,上面哪些现在观察到 +2 的 DST,但 1980 年没有,将列表缩减为:

  1. 非洲/卡萨布兰卡
  2. 非洲/休达
  3. 欧洲/安道尔
  4. 欧洲/贝尔格莱德
  5. 欧洲/直布罗陀
  6. 欧洲/苏黎世

目前所有的标准偏移量为 +1,DST 为 +2,但在 1979 年或 1980 年没有观察到 DST。因此很可能您正在使用其中一个位置(或链接到上述位置之一的另一个位置作为别名或者因为它已被弃用)。

一些位置代表许多其他位置,例如 Europe/Zurich 也是Europe/BusingenEurope/Vaduz的规范位置,也用于23 个其他命名的位置

DST 可能会继续在欧洲发生变化,特别是因为欧盟希望完全停止观察 DST。从 2020 年开始,成员国可以选择是否继续遵守。有些人会继续观察它,有些人会全年使用标准偏移量,有些人会全年使用 DST 偏移量。预计世界其他地区也会更频繁地开始使用偏移量。

也有像爱尔兰这样的地方在夏季遵守标准时间 (+1),而在冬季将时钟拨回 1 小时 (+0),这就是为什么欧洲/都柏林的 DST 似乎在冬季为 -1 小时。:-)


推荐阅读