为何JavaScript中new Date()与带Z的日期字符串实例化时区结果不同?
问题描述
我在JavaScript中尝试展示日期,从Java后端的Instant对象获取到格式为2020-09-22T17:10:25Z的日期字符串。调用new Date("2020-09-22T17:10:25Z")得到Tue Sep 22 2020 20:10:25 GMT+0300 (Eastern European Summer Time),但我实际处于GMT+0200时区;而调用new Date()得到Thu Dec 08 2022 20:34:11 GMT+0200 (Eastern European Standard Time),是正确时区。想请教为何两种方式时区结果不同?其中字符串中的Z代表Zulu(零时区偏移)。
问题解答
这是因为**夏令时(DST)**的影响:
- 你解析的日期
2020-09-22处于东欧夏令时生效时段,此时该时区的偏移是GMT+0300;而当前日期2022-12-08处于东欧冬令时时段,偏移为GMT+0200。 - JavaScript的
Date对象在解析带时区标识(这里的Z代表零时区)的字符串时,会将其转换为你本地时区的对应时间,并且会自动应用该日期所在时段的夏令时/冬令时规则。 - 两者的时区显示差异并非错误,只是对应不同日期时段的时区偏移规则:9月属于夏令时周期,转换后的本地时间使用GMT+0300;12月是冬令时周期,
new Date()显示GMT+0200,都是符合本地时区规则的正确结果。
内容的提问来源于stack exchange,提问作者Smoke HHH
相关产品推荐
相关产品推荐

