javascript - 为什么在 Safari 中使用 JavaScript 计划 Q1 year 22034 不可靠?

标签 javascript safari magic-numbers leap-year future-proof

在浏览器端 (Safari 5.0.1) 计算遥远的 future 日期时,将字符串传递给 Date() 构造函数时,有一些可疑的地方:

我将范围缩小到 22034 年 2 月到 3 月的过渡期:

d = new Date('1 Mar 22034')
Tue Feb 28 22034 00:00:00 GMT+0000 (GMT)

任何以后的日期喂它,构造函数总是返回一个 Date 对象关闭一天!

更早的日期呢?二月的最后一天看起来不错:

d=new Date('28 Feb 22034')
Tue Feb 28 22034 00:00:00 GMT+0000 (GMT)

我的直觉告诉我这看起来像一个 leap-year相关错误。但是这里的模式是什么,错误的解释是什么?


编辑:

如果我们要求 2 月 29 日怎么样?

d=new Date('29 Feb 22034')
Wed Mar 01 22034 00:00:00 GMT+0000 (GMT)

返回 2 月的最后一天 + 1 天(其标准行为)。

最佳答案

这是因为您给 new Date() 的日期格式是非标准的。你得到任何东西的事实是因为 Safari 帮了你一个忙。 (有关有效格式,请参阅 the spec 的第 15.9.1.15 节;基本上是一个简化的 ISO-8601。并且拥有任何解析日期/时间字符串的标准是相对较新的 [第 5 版]。)

如果您使用标准构造函数,例如 new Date (22034, 2, 1)(月份从零开始,即 22034 年 3 月 1 日),它可以正常工作。你可以这样测试它(live copy):

display("With non-standard string: " + new Date("1 Mar 22034"));
display("Using standard constructor: " + new Date(22034, 2, 1));

对我来说,使用 Windows 版 Safari 会导致:

With non-standard string: Tue Feb 28 22034 00:00:00 GMT+0000 (GMT Standard Time)
Using standard constructor: Wed Mar 01 22034 00:00:00 GMT+0000 (GMT Standard Time)

如您所见,第一行显示的日期不正确,而第二行显示的日期正确。

标准构造函数在 Chrome、Opera 和 Firefox(均在 Ubuntu 下)、IE6、IE7 和 IE8 中也能正常工作:http://jsbin.com/ogiqu

如果 Safari 确实无法处理该日期(而不是不解析您可靠地提供的非标准字符串),这将是一个令人惊讶的 Safari 特定错误。来自 the spec 的第 15.9.1.1 节:

Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC. In time values leap seconds are ignored. It is assumed that there are exactly 86,400,000 milliseconds per day. ECMAScript Number values can represent all integers from –9,007,199,254,740,991 to 9,007,199,254,740,991; this range suffices to measure times to millisecond precision for any instant that is within approximately 285,616 years, either forward or backward, from 01 January, 1970 UTC.

但是当您不要求它偏离轨道时,Safari 似乎可以很好地处理它,显然问题出在非标准字符串的解析代码中。

关于javascript - 为什么在 Safari 中使用 JavaScript 计划 Q1 year 22034 不可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4316126/

相关文章:

javascript - Safari 文本框背景问题

ios - swift UIActivityViewController

python - 自 OSX Lion 以来出现导入错误 : Bad magic number,

c++ - 这些会被认为是神奇的数字吗?

javascript - 将对象数组随机拆分为两个相等的数组

javascript - 在不同的文件中创建幻灯片

php - 如何使用javascript检查是否选择了文件?

javascript - 何时在 mongodb 中使用 new 关键字?

javascript - 反复绘制更新图像到 Canvas (Safari 在加载期间清空图像)

c++ - 常量在这里真的合适吗,还是有另一种方法? - C++