Chrome中JavaScript Date解析旧日期异常的问题求助
关于Chrome 74中Date对象解析旧ISO日期的异常问题
这确实是Chrome(基于V8引擎)在处理1900年之前日期时的一个已知历史问题,咱们一步步来解答你的疑问:
1. 你的输入是合法的ISO 8601格式吗?
完全没问题!你使用的YYYY-MM-DDTHH:mm:ss±HH:mm是标准的带时区偏移的ISO 8601日期格式,语法和格式都符合规范。
2. 这是Chrome的Bug吗?
是的,准确说是旧版本V8引擎的Bug。Chrome 74使用的V8版本在处理1900年之前的历史日期时,没有正确应用早期的时区规则(比如中欧时区的历史偏移和现代规则有差异),导致解析后的本地时间出现了不符合预期的偏差(比如你看到的23:53:28 GMT+0053这种奇怪的时区偏移)。
而Firefox对历史时区数据的处理逻辑更准确,所以能得到符合预期的结果。这个问题在后续的Chrome版本(大概79及以后)已经被修复了,如果你升级Chrome到较新版本,这个异常就会自动消失。
3. 不升级浏览器的情况下怎么修复?
如果你暂时无法更新Chrome,又不想自己手动解析字符串,可以试试这两个方案:
方案一:用Date.UTC()手动构造日期
通过拆分ISO字符串的各个部分,手动计算UTC时间后再创建Date对象,绕开原生解析的Bug:
function parseLegacyISO(dateStr) { // 拆分ISO字符串的各个部分 const [datePart, timePart] = dateStr.split('T'); const [year, month, day] = datePart.split('-').map(Number); const [time, offset] = timePart.split('+'); const [hour, minute, second] = time.split(':').map(Number); const [offsetHour, offsetMinute] = offset.split(':').map(Number); // 计算UTC时间(注意月份是0基) const utcTimestamp = Date.UTC( year, month - 1, day, hour - offsetHour, minute - offsetMinute, second ); return new Date(utcTimestamp); } // 测试使用 console.log(parseLegacyISO('1893-01-01T00:00:00+01:00'));
方案二:使用第三方日期库
像moment.js或者date-fns这类成熟的日期库,对历史日期和时区的处理比原生Date更可靠,不需要自己写复杂的解析逻辑:
// 使用moment.js的例子 moment('1893-01-01T00:00:00+01:00').toDate(); // 使用date-fns的例子 import { parseISO } from 'date-fns'; parseISO('1893-01-01T00:00:00+01:00');
内容的提问来源于stack exchange,提问作者cmxl
相关产品推荐
相关产品推荐

