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

如果你采取以下措施:

var s = "2/8888/2016";
var d = new Date(s);
alert(d);

在Chrome中,您将获得:

失效日期

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

周五06月01日2040 00:00:00 GMT-0500(中央夏令时间)

它似乎只是增加8888天到2月01日。相反,我认为该日期被认为是无效的。 有没有办法让FireFox和IE认为这个日期字符串是无效的?


简短的回答:

这是你提到的浏览器的一个错误行为。

您必须自行检查日期格式是否正确。 但这是相当微不足道的,我建议这种方法:

在第y ,第m月,第d天拆分日期并创建Date对象:

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

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

var isValid = date.getDate() == d &&
              date.getMonth() == m-1 &&
              date.getFullYear() == y;

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

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



长答案:

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

事实上,根据ECMAScript 2015 Language Specification,当使用单个字符串参数调用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(1月)到12(12月)的一年中的月份。

DD是从01到31的月份的一天。


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

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

注:如果Date作为具有多个参数的构造函数调用,如果值大于它们的逻辑范围(例如,13提供为月份值或70代表分钟值),则会调整相邻值。 例如,新日期(2013,13,1)等同于新日期(2014,1,1),两者均创建2014-02-01的日期(请注意该月为0)。 对于其他值也是如此:新日期(2013,2,1,0,70)相当于新日期(2013,2,1,1,10),它们都创建了2013-03-01T01:10:00的日期。

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


没有办法让IE和FF认为它是无效的,除了:

  • 你可以改变他们的JavaScript实现
  • 你用一个库来处理这个问题。
  • 我们也可以期待JavaScript作为一种语言发展,我们可以跨越我们的手指,浏览器决定遵循更严格的规范。 当然,问题在于每个“修复”都必须向后兼容该语言的以前版本(不会总是发生,例如Perl)。

    所以现在最好的办法就是像Derek在帖子评论中建议的那样,使用一些类似于momentjs的库。


    你偶然发现了另一个原因,你应该手动解析日期字符串。

    当Date提供单个字符串参数时,它被视为日期字符串并根据Date.parse中的规则进行分析。 那里的规则首先尝试将其解析为ISO 8601格式的字符串。 如果这不起作用,它可能会回退到任何它想要的解析算法。

    在“2/8888/2016”的情况下,浏览器将首先尝试将其解析为ISO格式并失败。 从实验看来,IE和Firefox确定字符串是月/日/年格式,并有效地调用Date构造函数:

    new Date(2016,1,8888);
    

    但是,其他浏览器可能会尝试验证这些值并确定8888不是有效日期或月份,因此请返回无效日期。 两种响应都符合ECMA-262。

    最好的建议是始终手动解析日期字符串(一个库可以提供帮助,但通常不需要,因为具有验证的定制解析函数是3行代码),那么您可以在任何浏览器或主机环境中确定一致的结果。

    链接地址: http://www.djcxy.com/p/89699.html

    上一篇: Why is 2/8888/2016 a valid date in IE and Firefox?

    下一篇: mysql, space equals empty string