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

JavaScript中Date.parse解析特定日期为何得到2000年结果?

日期解析异常原因:0001-01-01 00:00:00为何变成2000年?

你遇到的问题是不同日期格式触发了JS引擎两种完全不同的解析逻辑导致的,具体原因如下:

三种情况的差异重现

// 符合预期:UTC时间公元1年1月1日
new Date(Date.parse('0001-01-01'))
// 异常:UTC时间2000年12月31日23点
new Date(Date.parse('0001-01-01 00:00:00'))
// 符合预期:UTC时间公元1年1月1日
new Date(Date.parse('0001-01-01T00:00:00Z'))

1. 标准ISO 8601格式的严格解析

当日期字符串符合ECMAScript规范的ISO 8601格式时,解析器会严格按规则处理:

  • 纯日期YYYY-MM-DD(如'0001-01-01'):默认解析为UTC时区的该日期,4位年份0001直接被识别为公元1年,无歧义。
  • 带T和时区的格式YYYY-MM-DDTHH:mm:ssZ(如'0001-01-01T00:00:00Z'):T是日期与时间的强制分隔符,Z明确指定UTC时区,年份同样被严格识别为公元1年,结果正确。

2. 非标准格式的兼容式解析

而'0001-01-01 00:00:00'用空格分隔日期和时间,不属于标准ISO格式,JS引擎会回退到为兼容旧系统设计的非标准解析逻辑,这里有两个关键问题:

  • 年份被错误映射:旧解析逻辑对前两位为00的4位年份,会当作两位数年份处理。按照早期兼容规则,两位数年份00-69会被映射到2000-2069区间,所以0001被识别为01,对应到2001年。
  • 时区转换导致日期偏移:非标准格式默认使用本地时区解析,而非UTC。假设你的本地时区是UTC+1,那么本地时间的2001-01-01 00:00:00转换为UTC时间就是2000-12-31T23:00:00Z,也就是你看到的结果。

本质上,空格分隔的格式触发了旧的兼容解析逻辑,把公元1年误判为2001年的本地时间,再转UTC就出现了年份偏移。

内容的提问来源于stack exchange,提问作者KeV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:36:30