165

Date我想知道 Javascript对象允许的最小日期和最大日期是哪个。我发现最小日期大约是公元前 200000 年,但我找不到任何关于它的参考资料。

有人知道答案吗?我只是希望它不依赖于浏览器。

“纪元时间”(= 1970-01-01 00:00:00 UTC+00 的毫秒数)的答案是最好的。

4

4 回答 4

202

根据规范,§15.9.1.1

Date 对象包含一个数字,该数字指示特定的瞬间,精确到毫秒。这样的数字称为时间值。时间值也可能是 NaN,表示 Date 对象不代表特定的时间瞬间。

自 1970 年 1 月 1 日 UTC 以来,时间在 ECMAScript 中以毫秒为单位进行测量。在时间值中,闰秒被忽略。假设每天正好有 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 对象支持的实际时间范围略小:相对于 1970 年 1 月 1 日 UTC 开始时的午夜,精确地测量 –100,000,000 天到 100,000,000 天。这为 1970 年 1 月 1 日 UTC 的任一侧提供了 8,640,000,000,000,000 毫秒的范围。

UTC 时间 1970 年 1 月 1 日开始的午夜的确切时刻由值 +0 表示。

第三段是最相关的。根据该段,我们可以从 获得每个规范的准确最早日期new Date(-8640000000000000),即公元前 271,821 年 4 月 20 日星期二(BCE =共同时代之前,例如,-271,821 年)。

于 2012-07-17T16:10:35.160 回答
74

为了增加 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

于 2017-05-05T00:24:02.160 回答
8

对已接受答案的小修正;最小日期的年份实际上是 271,82 2 BCE,正如您在运行以下代码段时看到的那样:

console.log(new Date(-8640000000000000).toLocaleString("en", {"year": "numeric", "era": "short"}))

事实上,-271,821 年实际上是公元前 271,822 年,因为 JavaScript Date(连同ISO 8601)使用天文年份编号,它使用零年。因此,第 1 年是公元 1 年,第 0 年是公元前 1 年,-1 年是公元前 2 年,等等。

于 2021-06-02T16:20:51.983 回答
-11

如您所见,01/01/1970 返回 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
于 2018-07-30T09:57:20.910 回答