最小和最大日期

182

我想知道JavaScript的Date对象允许设置的最小和最大日期是什么。我发现最小日期大约在公元前200000年左右,但是没有找到确切的参考资料。

有人知道答案吗?我希望这不会取决于浏览器。

用“纪元时间”(从1970年01月01日00:00:00 UTC+00开始计算的毫秒数)回答最好。


1
如何获取最小和最大日期 - Kieveli
5个回答

220

来自规范,§15.9.1.1

一个日期对象包含一个数字,表示某一时刻到毫秒的时间值。这样的数字称为时间值。时间值也可能是NaN,表示日期对象不代表特定的时间点。 在ECMAScript中,时间以自1970年1月1日UTC起的毫秒数来衡量。在时间值中,闰秒被忽略。假设每天恰好有86400000毫秒。ECMAScript数字值可以表示从-9007199254740992到9007199254740992的所有整数;这个范围足以以毫秒精度测量任何在距离1970年1月1日UTC前后约285616年内的任何时刻。 ECMAScript日期对象支持的实际时间范围略小:相对于1970年1月1日UTC午夜测量的确切时间为-100,000,000天至100,000,000天。这给出了距离1970年1月1日UTC前后8640000000000000毫秒的范围。 1970年1月1日UTC午夜准确时刻的值为+0。

第三段是最相关的。根据该段落,我们可以从new Date(-8640000000000000)获取规范中最早的确切日期,即公元前271,821年4月20日(BCE = 公元前Common Era,例如-271,821年)。


1
所以这就是为什么它不能与-9223372036854775808L一起使用的原因...即使我将其更改为日期,接收器仍会返回超出范围的正值。 - Hassan Faghihi
1
我不知道人们在抱怨什么,这对我来说很好用。顺便问一下,是否有任何方法可以反向使用它(即输入BCE日期并将纪元秒作为负整数弹出)? - Mark Seagoe
1
@MarkSeagoe - Date.UTC(-271821, 3, 20) 返回 -8640000000000000。 :-) - T.J. Crowder
new Date('275760-9-13 05:30:00') - AshTyson
1
@AshTyson - 如果你想知道为什么会出现“Invalid Date”的错误,有三个原因:1.如果你的年份超过四位数,必须在开头使用“+”或“-”。2. “09”缺少“0”。3.它只适用于某些时区(特别是:GMT+05:30或更高),因为最晚的日期是275760-09-13午夜GMT。有关格式的更多信息,请参见此处。因此,在GMT+05:30(或+06:00等)中,这将起作用:new Date("+275760-09-13T05:30:00.000") - T.J. Crowder
显示剩余5条评论

92
为了补充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


13

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

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

的确,公元前271821年实际上是公元前271822年,因为JavaScript的Date(以及ISO 8601)采用宇宙年代计数法,该计数法使用了一个零年。 因此,1年是公元1年,0年是公元前1年,-1年是公元前2年,以此类推。


4
您的技术上是正确的。这是最好的正确方式。 - MaxArt

-3

var startingDate = new Date().toISOString().split('T')[0] + "T00:00:00.001Z"; // 用于2022年07月25日 00时00分00秒 var endingDate = new Date().toISOString().split('T')[0] + "T23:59:59.999Z" ;


2
欢迎来到Stack Overflow!虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Yunnosch

-17

正如您所看到的,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

12
我的回答重点是什么?它如何回应原始问题? - MaxArt
11
1970年1月1日并非最早可能的日期。您可以传递一个负数以获取在1970年1月1日之前的日期。 - inejwstine
1
01/01/1970是UNIX时间的起点,这就是为什么它返回0的原因。https://en.wikipedia.org/wiki/Unix_time - lenooh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接