背景:最近接触国家化和 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 了。