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

时间:2014-12-22 07:51:39

标签: javascript google-chrome date

所以我试图找到Javascript可以处理的最新Date

我把它降到了275760年9月,并且当我开始从illegal accessnew 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。< / p>

我查看了错误堆栈,它来自命令行界面,这并不是非常有用(除非它表明错误必须源自内部代码)。

所以问题是,为什么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找到了这个。

1 个答案:

答案 0 :(得分: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
  3. 出于所有实际目的,最大日期应表示为:

    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