时区 Bug

338 阅读1分钟

背景:最近接触国家化和 Excel 日期处理遇到了时区问题。

结论:1901-01-01 上海时区从 0805 调整成 0800。


见代码。好家伙,还有这种问题。

import dayjs from 'dayjs';

// 当前时区
Intl.DateTimeFormat().resolvedOptions().timeZone;

/* 存在时区问题 */
var basedate = new Date(1900, 0, 1, 0, 0, 0);
basedate; // 1899-12-31T15:54:17.000Z
basedate.getTimezoneOffset(); // -485
dayjs(basedate).format(); // 1900-01-01T00:00:00+08:00

/* 1901-01-01 开始调整 Asia/Shanghai 时区 */
var basedate = new Date(1901, 0, 1, 0, 0, 0);
basedate; // 1900-12-31T16:00:00.000Z
basedate.getTimezoneOffset(); // -480
dayjs(basedate).format(); // 1901-01-01T00:00:00+08:00

new Date(1900, 0, 1, 0, 0, 0); 这个代码实际上是当前时区的 1900-01-01 00:00:00。

转回 0 时区后(时区转换)就变成 1899-12-31T15:54:17.000Z 了。

也就是时区转换出现了 bug。

查了资料,这里给出了解释 www.timeanddate.com/time/zone/c…

即在 1901-01-01 之前,上海时区的时区和 0 时区相差 0805。

即在 1901-01-01 之后,上海时区的时区和 0 时区调整成相差 0800。

那我们平时需要注意什么?

  • 一般不太需要注意,因为很少会用到 1901 年之前的时间。 new Date(0) 的起始日期都在 1970 了。