【发布时间】:2012-07-16 14:39:38
【问题描述】:
我想知道 JavaScript Date 对象允许的最小和最大日期是哪个。我发现最小日期大约是公元前 200000 年,但我找不到任何关于它的参考资料。
有人知道答案吗?我只是希望它不依赖于浏览器。
“纪元时间”(= 1970-01-01 00:00:00 UTC+00 的毫秒数)的答案是最好的。
【问题讨论】:
标签: javascript datetime max
我想知道 JavaScript Date 对象允许的最小和最大日期是哪个。我发现最小日期大约是公元前 200000 年,但我找不到任何关于它的参考资料。
有人知道答案吗?我只是希望它不依赖于浏览器。
“纪元时间”(= 1970-01-01 00:00:00 UTC+00 的毫秒数)的答案是最好的。
【问题讨论】:
标签: javascript datetime max
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 天。这给出了 8,640,000,000,000,000 毫秒到 1970 年 1 月 1 日 UTC 的任一侧的范围。
UTC 时间 1970 年 1 月 1 日开始的午夜的确切时刻由值 +0 表示。
第三段是最相关的。根据该段,我们可以从 new Date(-8640000000000000) 获得每个规范的准确最早日期,即公元前 271,821 年 4 月 20 日星期二(BCE = Common Era 之前,例如,-271,821 年)。
【讨论】:
Date.UTC(-271821, 3, 20) 返回-8640000000000000。 :-)
Invalid Date,有三个原因: 1. 如果你有超过四年的数字,你必须使用+ 或@987654329 @开头。 2. 在09 上缺少0。 3. 它只在某些时区的范围内(特别是:GMT+05:30 或更多),因为最近的日期是格林威治标准时间午夜 275760-09-13。有关here 格式的更多信息。所以在 GMT+05:30(或 +06:00 等),这会起作用:new Date("+275760-09-13T05:30:00.000")
为了增加 T.J. 的答案,超过最小/最大值会生成一个无效日期。
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
【讨论】:
对已接受答案的小修正;最小日期的年份实际上是 271,822 BCE,正如您在运行以下 sn-p 时看到的那样:
console.log(new Date(-8640000000000000).toLocaleString("en", {"year": "numeric", "era": "short"}))
事实上,-271,821 年实际上是公元前 271,822 年,因为 JavaScript 的 Date(以及 ISO 8601)使用 astronomical year numbering,它使用零年。
因此,第 1 年是公元 1 年,第 0 年是公元前 1 年,-1 年是公元前 2 年,依此类推。
【讨论】:
如您所见,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
【讨论】: