You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:28:25