You need to enable JavaScript to run this app. JavaScript toISOString() 何时返回6位年份的ISO 8601格式?
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript toISOString() 何时返回6位年份的ISO 8601格式?

触发6位带符号年份格式的核心判定规则

按照ECMAScript规范对toISOString()的实现要求,两种长度的返回字符串的分界非常明确:

  • 当Date实例对应的UTC时间的proleptic格里高利历年份值处于0~9999的闭区间内,方法会返回24位长度的YYYY-MM-DDTHH:mm:ss.sssZ格式字符串,这也是日常开发中最常见的返回结果。
  • 只要年份值不满足上述区间(也就是年份<0 或 年份>9999),方法就会返回27位长度的带符号扩展年份格式±YYYYYY-MM-DDTHH:mm:ss.sssZ。

扩展年份字段会固定补零到6位数字长度,搭配正负号作为年份的方向标识,完全符合ISO 8601对超出常规4位年份范围的时间的格式定义,返回值的时区始终为UTC零偏移,不会随本地时区变化。

实际代码示例

1. 年份小于0的触发场景

只要Date实例对应的年份是负数(即比 proleptic 历的0年更早的时间),就会触发27位格式返回。比如构造公元前1年的UTC时间:

// 构造UTC时间:proleptic 年份为 -1(对应公元前1年1月1日0点)
const bcSample = new Date(Date.UTC(-1, 0, 1));
console.log(bcSample.toISOString()); 
// 实际输出:"-000001-01-01T00:00:00.000Z"
console.log(bcSample.toISOString().length); 
// 实际输出:27

注:很多人会误以为年份0(即公元前1年)也会触发扩展格式,但实际上年份0属于0~9999的有效区间,返回的是24位长度的字符串,可以做个直观对比:

// 构造UTC时间:proleptic 年份为 0(即公元前1年1月1日0点)
const year0Sample = new Date(Date.UTC(0, 0, 1));
console.log(year0Sample.toISOString());
// 实际输出:"0000-01-01T00:00:00.000Z"
console.log(year0Sample.toISOString().length);
// 实际输出:24

2. 年份大于9999的触发场景

当Date实例对应的年份是10000及以上的正数时,同样会触发27位格式返回。比如构造公元10000年1月1日的UTC时间:

// 构造UTC时间:proleptic 年份为 10000(即公元10000年1月1日0点)
const farFutureSample = new Date(Date.UTC(10000, 0, 1));
console.log(farFutureSample.toISOString());
// 实际输出:"+010000-01-01T00:00:00.000Z"
console.log(farFutureSample.toISOString().length);
// 实际输出:27
日常开发的常见认知偏差
  • 很多开发者误以为只有年份超过10000才会触发扩展格式,实际上只要是负数年份(哪怕是-1),因为不在0~9999的区间内,就会触发带符号的6位年份返回。
  • 这种27位的返回在日常业务中几乎不会出现,因为常规业务涉及的时间范围基本集中在公元1900年到2100年之间,完全落在4位年份的覆盖区间内,这也是大家日常只观察到24位返回的核心原因。

内容的提问来源于stack exchange,提问作者salman irfan khandu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 15:06:07