为什么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作为一种语言发展,我们可以跨越我们的手指,浏览器决定遵循更严格的规范。 当然,问题在于每个“修复”都必须向后兼容该语言的以前版本(不会总是发生,例如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