Answers:
根据规范§15.9.1.1:
Date对象包含一个数字,该数字指示毫秒内的特定时间点。这样的数字称为时间值。时间值也可以是NaN,表示Date对象不代表特定的时刻。
自1970年1月1日UTC以来,时间以ECMAScript表示,以毫秒为单位。在时间值上,leap秒将被忽略。假设每天精确地有86,400,000毫秒。ECMAScript Number值可以表示从–9,007,199,254,740,992到9,007,199,254,740,992的所有整数;从1970年1月1日UTC向前或向后大约285,616年内,此范围足以测量毫秒级的时间。
ECMAScript Date对象支持的实际时间范围略小:相对于UTC 1970年1月1日开始的午夜,精确到–100,000,000天至100,000,000天。这给UTC 1970年1月1日的任一侧提供了8,640,000,000,000,000毫秒的范围。
格林尼治标准时间1970年1月1日开始的确切午夜时刻由值+0表示。
第三段是最相关的。根据该段,我们可以从获取每个规范的确切最早日期new Date(-8640000000000000)
,即公元前271,821年4月20日(星期二)(公元前= 共同时代之前,例如-271,821年)。
Date.UTC(-271821, 3, 20)
返回-8640000000000000
。:-)
为了增加TJ的答案,超过最小/最大值会生成一个无效日期。
let maxDate = new Date(8640000000000000);
let minDate = new Date(-8640000000000000);
console.log(new Date(maxDate.getTime()).toString());
console.log(new Date(maxDate.getTime() - 1).toString());
console.log(new Date(maxDate.getTime() + 1).toString()); // Invalid Date
console.log(new Date(minDate.getTime()).toString());
console.log(new Date(minDate.getTime() + 1).toString());
console.log(new Date(minDate.getTime() - 1).toString()); // Invalid Date
如您所见,1970年1月1日返回0,这意味着它是最低的日期。
new Date('1970-01-01Z00:00:00:000') //returns Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
new Date('1970-01-01Z00:00:00:000').getTime() //returns 0
new Date('1970-01-01Z00:00:00:001').getTime() //returns 1