如果你采取以下措施:
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认为这个日期字符串无效?
简短回答:
这是您提到的浏览器的不当行为。
您必须自行检查日期格式是否正确。但这很简单,我建议采用这种方法:
将日期拆分为年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)
在执行所有这些操作之前,您可能需要检查日期字符串对于任何浏览器是否有效:
长答案:
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
归档时间: |
|
查看次数: |
135 次 |
最近记录: |