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
相关产品推荐
相关产品推荐

