Chrome 67+ 显示 1901年1月1日 之前的日期 时区“错误”
看下面3张图,对于 Chrome 67和68,new Date(1900, 0, 31) 的结果,时区偏移居然是 +0805。此结果同样出现在 安卓版 Webview 67。
然而,Chrome 66 及以前的版本,是正常的,如下图:
下面是来自 Stack Overflow的解释,下面以 中国 本地时间为例:
1、将年月日时分秒单独传递给 Date 构造函数时,这些单独的值是基于计算机所在的本地时区。new Date(1900,0,31,0,0,0,0) 代表 1900-01-31 00:00:00.000 本地时间.
2、时区是一个比较现代的发明,以前不存在时区的概念。大多数计算机保留的有关时区的数据来自IANA时区数据库(Time Zone Database, TZDB)。在此数据中,对于大多数时区,最早的条目是基于与用于识别时区的城市相关的纬度和经度的太阳本地平均时间(LMT)。
3、new Date(1900,0,31,0,0,0,0) 转为 UTC 时间是 1900-01-30 16:00:00.000 UTC,中国标准时间与 UTC 的偏差为 +08:00
4、TZDB 中值为 +08:00 的是 Asia/Shanghai
5、TZDB 中 Asia/Shanghai 的时区偏移 不止 +08:00 一个,如下图,在 1850-1900 年,偏移量为 +08:05:43,1901年以及后,偏移量才是 +08:00,如下图(详情 查看这里):
6、因为上述的截断,Chrome 66及以前的版本,对于所有的中国本地时间,可能只考虑了1901年之后的偏移量,而没有考虑整个 TZDB。Chrome 67+ 做了修正,所以看上去像个“错误”。
同样受此影响的还有 乌克兰 本地时间