您可以创建低于 271800 BC 的日期吗?喜欢恐龙时代?

Posted

技术标签:

【中文标题】您可以创建低于 271800 BC 的日期吗?喜欢恐龙时代?【英文标题】:Can you create dates that are lower than 271800 BC? Like dinosaur time? 【发布时间】:2012-02-10 05:32:03 【问题描述】:

这似乎是 javascript 日期的最低值:

var myDate = new Date(0, 0, 1);
myDate.setFullYear("-271800");
alert(myDate);

低于 -271,800 BC 的任何内容都会引发无效日期错误。我们能回到一百万年前吗?还是十亿?日期对象可以让你无限地描述过去或未来的任何日期吗?我怎么能做这样的事情?

【问题讨论】:

对不起 - 我的意思是主题行中的 BC!今天脑子炸了。 你为什么要这样做? 当您谈论计算机时,没有无限这样的东西,总有一个数字可以代表它。似乎 Javascript 的人认为 -271800 似乎很遥远。您可以使用自己的课程来进行这种时间管理,以便及时描述遥远的日期 -271800 只是271800 BC @MitchWheat 因为他正在为他的时间机器编写软件。呵呵。 【参考方案1】:

代表一百万年前的特定日期让我觉得毫无意义。儒略历?一周中的几天应该尊重Babylonian 系统吗?

为此创建您自己的类型,决定您实际需要表示的内容。

--- 更新:这已被接受,所以我将添加一些更具体的位。 ---

正如另一个答案中提到的,根据EcmaScript spec, pg 164 of the fifth edition(链接是.pdf。)

自 1970 年 1 月 1 日以来,时间在 ECMAScript 中以毫秒为单位测量 世界标准时间。在时间值中,闰秒被忽略。假设 每天正好有 86,400,000 毫秒。 ECMAScript 编号 值可以表示从 –9,007,199,254,740,991 到的所有整数 9,007,199,254,740,991;这个范围足以测量时间 任何瞬间的毫秒精度,大约在 从 1970 年 1 月 1 日 UTC 起,向前或向后 285,616 年。

ECMAScript Date 对象支持的实际时间范围是 稍微小一点:正好 –100,000,000 天到 100,000,000 天 相对于 1970 年 1 月 1 日开始时的午夜测量 世界标准时间。这给出了 8,640,000,000,000,000 毫秒的范围 UTC 时间 1970 年 1 月 1 日的任一侧。

但是,这是理论上的日期。它忽略了一些现实。一百万年前的日子更短(缩短了 12 秒),因此一些 JavaScript 数学运算可能不准确。一周中的天数已由不同的系统确定。月份的定义不同。总而言之,决定你真正需要代表什么。

【讨论】:

是的 - 考虑如何构建一个通用的日期/时间选择器是相当复杂的。时间越早,日子也越短。可能只需要将精度降低到超过某个阈值的一年。时间也与位置有关。冥王星上的日子要长一些。【参考方案2】:

ECMAScript 标准要求 Date 对象能够表示 1970 年 1 月 1 日之前或之后 1 亿天内的任何日期和时间,精确到毫秒。这是一个正负 273,785 年的范围。为了表示超出此范围的日期,您需要实现自己的日期对象,该对象不以毫秒分辨率运行。

【讨论】:

感谢 Dylan - 这是非常有用的信息 - 感谢您提供的事实!【参考方案3】:

您应该为此构建自己的 DateTime。它的复杂性取决于您想要实现的目标...如果您只想代表年份,那么它只是一个简单的数字...如果您想说明 1 200 000 BC 的最后一个星期日是什么日期,那就更多了复杂...但请记住,那一年不存在星期日:)...我们现在使用的公历是公元 1582 年推出的,儒略历是公元前 45 年推出的(我不确定在那之前是什么)。我认为即使是 javascript DateTime 也没有考虑到这一点,因此将其设置为公元前 271800 年是没有意义的。

【讨论】:

【参考方案4】:

根据https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date:

JavaScript 日期从 01 午夜开始以毫秒为单位 世界标准时间 1970 年 1 月。一天有 86,400,000 毫秒。 JavaScript 日期对象范围是 -100,000,000 天到 100,000,000 天,相对于 UTC 时间 1970 年 1 月 1 日。

JavaScript Date 对象提供跨平台的统一行为。

资源是有限的,对于任何给定的数据类型,开发人员必须在存储、性能和范围之间做出折衷。恕我直言,日期的 ecmascript 范围对于任何实际问题都足够大。

【讨论】:

有很多有效和实际的理由可以追溯到 25 万多年前,并且想要一个“经过良好测试/记录的原生”对象的简单性。 OP 的问题说问 Date 是否不能这样做,什么可以。 @AaronSherman:您愿意说出其中的一些实际原因吗?老实的问题,以我迟钝的智力,我无法想象为什么我们当前的日历对发生在旧石器时代中期的事件很重要。 时间线网络应用程序是我想到的。我意识到除了纯日期时间之外还有很多其他的解决方案,但是能够轻松地从旧石器时代扩展到现代实际上是相当不错的。此问题的示例时间表:scholarslab.org/research-and-development/… 和 github.com/NUKnightLab/TimelineJS/issues/273 恕我直言,说微秒级分辨率对于这种规模是实用的,这有点牵强。 我同意超过 500k 年的微发送分辨率是矫枉过正,而且规格非常合理。我的评论是,询问是否存在一个可以追溯到 25 万年以上并具有时间概念的经过良好测试的物体并不是没有道理的。说“这个对象不存在,但可以构建”也是合理的。

以上是关于您可以创建低于 271800 BC 的日期吗?喜欢恐龙时代?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 @Query 在日期 Spring 数据 MongoDB 之间进行选择

django django 有像 cakephp 这样的自动时间戳创建/更新字段吗?

您可以指定日期时间的 XmlSerialization 格式吗?

我们可以明智地进行分区日期吗?

你应该总是喜欢 xrange() 而不是 range() 吗?

Python 中的日期可以感知时区吗?