【问题标题】:Weird error with Date, "uncaught illegal access"日期出现奇怪错误,“未捕获的非法访问”
【发布时间】:2015-06-01 03:59:57
【问题描述】:

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

我把它降到了 275760 年 9 月,并将我开始收到未捕获的 illegal access 异常的天数从 new Date('09/24/275760') 增加到 new Date('10/13/275760')。在new Date('09/24/275760') 之前,new Date 工作正常并给我Invalid Datenew Date('10/13/275760') 之后,new Date 再次开始正常工作并给我Invalid Date

我查看了错误堆栈,它来自命令行界面,这并没有真正的帮助(除了它表示错误必须来自内部代码这一事实之外)。

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

我在 Mac OSX Yosemite (10.10.3) 上运行 Chrome 43.0.2357.81(64 位)(官方版本)。

编辑

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

【问题讨论】:

  • 一路无效:jsfiddle.net/abhitalks/craz30o3Chrome-39 on Win-8.1 here.
  • @abhitalks 嗯,当我使用字符串时似乎出错了。见:jsfiddle.net/craz30o3/1
  • 它适用于其他浏览器。我在 Firefox、Epiphany 和 Chromium 中尝试过。它成功并给出了无效的日期。问题似乎只存在于 Google-Chrome 中。
  • @abhitalks 啊,有道理。如果您将此作为答案发布,我会接受。
  • @usandfriends:谢谢。添加为答案并删除上面的 cmets。 :)

标签: javascript google-chrome date


【解决方案1】:
  1. 根据此处的规范:http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1:实际时间范围是 8,640,000,000,000,000 毫秒到 1970 年 1 月 1 日 UTC 的任一侧。因此,您将获得的最大有效日期是“Sep 13 275760”而不是“Sep 23”。
  2. 对于日期(字符串),字符串值应采用 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

【讨论】:

  • 感谢分享这条很酷的信息。我更新了我的问题以反映我真正想问的问题,并且想知道您是否可以再看一次。
  • @usandfriends:您更新后的问题的答案在我回答的第 2 点。
  • 当我使用new Date('275760-09-24')的真实格式时,它仍然给我Uncaught illegal access
  • @usandfriends:正如我之前提到的,这种行为是特定于实现的,并且仅限于字符串。尝试传递完整的日期,它将起作用。见这里:jsfiddle.net/craz30o3/2
猜你喜欢
  • 2020-02-25
  • 2015-08-13
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
相关资源
最近更新 更多