最短和最长日期

Max*_*Art 121 javascript datetime max

我想知道哪个是Javascript Date对象允许的最小和最大日期.我发现最小日期是200000 bC,但我无法得到任何参考.

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

"epoch time"中的答案(= 1970-01-01 00:00:00 UTC + 00的毫秒数)将是最好的.

T.J*_*der 162

根据规范,§15.9.1.1:

Date对象包含一个数字,表示一个毫秒内的特定时刻.这样的数字称为时间值.时间值也可以是NaN,表示Date对象不表示特定的时刻.

自UTC时间1970年1月1日起,时间以ECMAScript为单位,以毫秒为单位.在时间值中,忽略闰秒.假设每天恰好有86,400,000毫秒.ECMAScript数值可以表示从-9,007,199,254,740,992到9,007,199,254,740,992的所有整数; 此范围足以测量从UTC时间1970年1月1日起向前或向后约285,616年内的任何瞬间的毫秒精度.

ECMAScript日期对象支持的实际时间范围略小:相对于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日星期二(BCE = 普通时代之前,例如,-271,821年).

  • @MarkSeagoe - `Date.UTC(-271821, 3, 20)` 返回 `-8640000000000000`。:-) (2认同)
  • @AshTyson - 如果您问为什么会出现“无效日期”,则有以下三个原因: 1. 如果您的年份数字超过四年,则必须在开头使用“+”或“-”。2.“09”上缺少“0”。3. 它仅在某些时区范围内(特别是:GMT+05:30 或更多),因为最新日期是 275760-09-13 午夜 GMT。有关格式的更多信息[此处](https://tc39.es/ecma262/#sec-date-time-string-format)。因此,在 GMT+05:30(或 +06:00 等)中,这可以工作:`new Date("+275760-09-13T05:30:00.000")` (2认同)

Sha*_*tin 42

为了增加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
Run Code Online (Sandbox Code Playgroud)


小智 14

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

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

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

  • 从技术上来说你是正确的。最好的正确方式。 (4认同)