日期出现奇怪错误,"uncaught illegal access"

6

我试图找到 JavaScript 能处理的最新日期。我将其确定为 275760 年 9 月,并在遇到未捕获的 “非法访问” 异常之前增加了天数,范围从 new Date('09/24/275760')new Date('10/13/275760')。在 new Date('09/24/275760') 之前,new Date 正常工作并给出“无效日期”,在 new Date('10/13/275760') 之后,new Date 再次正常工作并给出“无效日期”。

我查看了错误堆栈,发现它起源于命令行界面,这对我没什么帮助(除了表明该错误必须源于内部代码)。

因此问题是,为什么 new Date 在这些特定日期上抛出错误,而不是按照定义的行为给出“无效日期”呢?

我的操作系统是 Mac OSX Yosemite (10.10.3),浏览器是 Chrome 43.0.2357.81 (64 位)(正式版本)。

编辑

只有当我使用字符串时才会出现这种情况(例如:new Date('10/01/275760'))。请参见此 JSFiddle 。然而,当使用整数参数时(例如:new Date(275760, 10, 1)),它似乎工作正常。感谢 @abhitalks 发现这个问题。


整个过程都是无效的:http://jsfiddle.net/abhitalks/craz30o3/,在这里使用的是Win-8.1上的Chrome-39。 - Abhitalks
@abhitalks 嗯,当我使用字符串时似乎出错了。请参见:http://jsfiddle.net/craz30o3/1/ - rgajrawala
@abhitalks 噢,明白了。如果你把这个发表为答案,我会接受它的。 - rgajrawala
@Abhitalks 回到这个问题,我意识到我在寻找一个关于为什么特定代码 new Date('10/01/275760') 抛出错误而不是像其他日期一样返回“无效日期”的答案,而不是询问未来支持的最远日期是什么。你有任何对这种奇怪行为的解释吗? - rgajrawala
@usandfriends:对于你更新后的问题,我的回答中第2点已经包含了答案。 - Abhitalks
显示剩余2条评论
1个回答

8
根据这里的规格:http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1:实际时间范围是格林威治时间1970年1月1日之前或之后的8,640,000,000,000,000毫秒。因此,你将得到的最大有效日期是“275760年9月13日”,而不是“9月23日”。
对于Date(string),字符串值应采用ISO8601(规格在此处:http://www.w3.org/TR/NOTE-datetime),格式为“yyyy-mm-dd”。其他任何格式都会被解析为本地时间,并受到“回退到实现特定的启发式”的影响。因此,你看到的行为是特定于实现的。(根据: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
实践中,最大日期应表示为:
var dt = new Date(8640000000000000)

var dt0 = new Date(275760, 8, 13);
var dt1 = new Date(275760, 9, 13);
var dt2 = new Date(275760, 9, 14);
var dt3 = new Date(8640000000000000);
var dt4 = new Date('275760-9-13');

console.log(dt0); // Sat Sep 13 275760 00:00:00 GMT
console.log(dt1); // Invalid Date (Reads October, 0-based month)
console.log(dt2); // Invalid Date
console.log(dt3); // Sat Sep 13 275760 05:30:00 GMT
console.log(dt4); // Sat Sep 13 275760 00:00:00 GMT


谢谢分享这个很酷的信息。我更新了我的问题以反映我真正想问的内容,不知道你能否再看一下它。 - rgajrawala
@usandfriends:你更新后的问题的答案在我的回答中的第二点。 - Abhitalks
当我使用new Date('275760-09-24')的正确格式时,它仍然会给我Uncaught illegal access - rgajrawala
@usandfriends:就像我之前提到的,这种行为是与实现有关的,并且仅限于字符串。尝试传递完整日期,它将起作用。在这里查看:http://jsfiddle.net/craz30o3/2/ - Abhitalks

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