Date的奇怪错误,"未经授权的非法访问"

usa*_*nds 3 javascript google-chrome date

所以我试图找到DateJavascript可以处理的最新内容.

我把它降低到九月275760和递增的日子,我开始一个未捕获illegal access的异常new Date('09/24/275760')new Date('10/13/275760').以前new Date('09/24/275760'),new Date正常工作,给我Invalid Date和之后new Date('10/13/275760'),new Date再次开始正常工作并给了我Invalid Date.

我查看了错误堆栈,它起源于命令行界面,这实际上没有用处(除非它表明错误必须源自内部代码).

所以问题是,为什么new Date抛出错误而不是遵循Invalid Date这些特定日期给定的定义行为?

我在Mac OSX Yosemite(10.10.3)上运行Chrome 43.0.2357.81(64位)(官方构建).

编辑

这似乎只有在我使用字符串时才会发生(EX :) new Date('10/01/275760').看到这个JSFiddle.但是,当使用整数参数(EX :)时new Date(275760, 10, 1),它似乎工作正常.感谢@abhitalks找到这个.

Abh*_*lks 5

  1. 根据规范:http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1:实际的时间范围是UTC时间1970年1月1日左右的8,640,000,000,000,000毫秒.因此,您将获得的最长有效日期为"9月13日275760"而不是"9月23日".
  2. 对于Date(字符串),字符串值应为ISO8601(此处为Spec: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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)