【问题标题】:Minimum and maximum date最小和最大日期
【发布时间】:2012-07-16 14:39:38
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript datetime max


【解决方案1】:

来自the spec, §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 天。这给出了 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 年)。

【讨论】:

  • 所以这就是为什么它不能与 -9223372036854775808L 一起使用......即使我将它更改为日期后,resever 返回正值超出范围值。
  • 我不知道人们在抱怨什么,这对我来说很好。顺便说一句,我想知道是否有任何方法可以反过来(即输入 BCE 日期并将纪元秒数作为负整数弹出)?
  • @MarkSeagoe - Date.UTC(-271821, 3, 20) 返回-8640000000000000。 :-)
  • 新日期('275760-9-13 05:30:00')
  • @AshTyson - 如果你问为什么它给你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")
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    对已接受答案的小修正;最小日期的年份实际上是 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 年,依此类推。

    【讨论】:

    • 您在技术上是正确的。最好的一种正确。
    【解决方案4】:

    如您所见,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
    

    【讨论】:

    • 你回答的意义何在?它如何回应最初的问题?
    • 1/1/1970 并不是最低的日期。您可以传递一个负数来获取 1970 年 1 月 1 日之前的日期。
    • 01/01/1970 是开始 UNIX 时间,这就是为什么它返回 0 ? en.wikipedia.org/wiki/Unix_time
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2013-11-29
    • 2012-09-05
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多