为什么2/8888/2016是IE和Firefox中的有效日期?

lha*_*han 7 javascript date

如果你采取以下措施:

var s = "2/8888/2016";
var d = new Date(s);
alert(d);
Run Code Online (Sandbox Code Playgroud)

在Chrome中,您将获得:

失效日期

但在IE和Firefox中,你会得到:

周五至周五2040 00:00:00 GMT-0500(中部夏令时)

它似乎只是在2月01日加入8888天.相反,我希望该日期被视为无效.有没有办法让FireFox和IE认为这个日期字符串无效?

Pao*_*olo 3

简短回答:

这是您提到的浏览器的不当行为。

您必须自行检查日期格式是否正确。但这很简单,我建议采用这种方法:

将日期拆分为年y、月m、日d并创建Date对象:

var date = new Date( y, m - 1, d ); // note that month is 0 based
Run Code Online (Sandbox Code Playgroud)

然后将原始值与使用以下方法获得的逻辑Date值进行比较:

var isValid = date.getDate() == d &&
              date.getMonth() == m-1 &&
              date.getFullYear() == y;
Run Code Online (Sandbox Code Playgroud)

在执行所有这些操作之前,您可能需要检查日期字符串对于任何浏览器是否有效:

在 JavaScript 中检测“无效日期”Date 实例



长答案:

Firefox(和 IE)接受“2/8888/2016”作为正确的字符串状态格式似乎是一个错误/不当行为。

事实上,根据ECMAScript 2015 语言规范,Date()使用单个字符串参数调用时,其行为应该与Date.parse()

http://www.ecma-international.org/ecma-262/6.0/#sec-date-value

后者

尝试根据日期时间字符串格式 (20.3.1.16) 中调用的规则(包括扩展年份)解析字符串的格式

..此处指定

http://www.ecma-international.org/ecma-262/6.0/#sec-date-time-string-format

你可以在哪里阅读

格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

[...]

MM 是一年中的月份,从 01(一月)到 12(十二月)。

DD 是每月 01 日到 31 日。


Firefox 似乎将字符串值解释为Date()使用多个参数调用时的字符串值。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

注意:当 Date 被调用为具有多个参数的构造函数时,如果值大于其逻辑范围(例如,提供 13 作为月份值或 70 作为分钟值),则相邻值将被调整。例如 new Date(2013, 13, 1) 相当于 new Date(2014, 1, 1),两者都会创建 2014-02-01 的日期(请注意,月份是从 0 开始的)。对于其他值也类似: new Date(2013, 2, 1, 0, 70) 相当于 new Date(2013, 2, 1, 1, 10) ,两者都会创建 2013-03-01T01:10:00 的日期。

这可以解释如何"2/8888/2016"变成2040-05-31T22:00:00.000Z