有没有人知道为什么在Firefox中如果执行下面的代码,如果传入的字符串是四个数字而只有四个数字,它会将其验证为日期?在我测试过的所有其他浏览器(IE,Chrome)中,它总是返回而不是日期。
正如下面的Marcel Korpel所指出的那样,该规范指出它应该回退使用Firefox的特定于实现的后退我真的想知道为什么Firefox的后退显示出这种异常现象。
function isDate(sDate) {
var temp = new Date(sDate);
if (temp.toString() == "NaN" || temp.toString() == "Invalid Date") {
alert("Not a Date");
} else {
alert("Is a Date!");
}
}
答案 0 :(得分:5)
如果将字符串传递给Date
构造函数,则字符串应采用parse方法(IETF-compliant RFC 1123 timestamps)识别的格式(来源:MDC)。其他所有内容都会导致特定于实现的行为,并且会因浏览器而异。
我建议您根本不使用字符串,并使用代表年,月和日的三个数字(请注意月份数字从0(= 1月)开始),或使用一个数字,自1970年1月1日00:00:00 UTC以来的毫秒数。
更新:查看您的示例,
var a = new Date('0123');
console.log(a);
输出
Fri Jan 01 0123 01:00:00 GMT+0100 (CET)
因此Firefox显然将'0123'
视为年份数字。
更新2 :我认为MDC's description of Date.parse
包含您问题的答案:
从JavaScript 1.8.5开始,也可以解析ISO 8601格式化日期字符串的子集。
ISO 8601页面指定(“格式”部分):
年份:
YYYY(例如1997年)
年月:
YYYY-MM(例如1997-07)
完成日期:
YYYY-MM-DD(例如1997-07-16)
因此,当依赖ISO 8601时,只包含四个数字的字符串将被识别为年份数字。
答案 1 :(得分:1)
不要依赖javascript中的日期验证。本地日期时间格式可能会使javascript日期对象产生一些问题。
使用以下方法
答案 2 :(得分:1)
这适用于所有浏览器 -
新日期(' 2001/01/31 12:00:00 AM')
答案 3 :(得分:0)
我在firefox中遇到了与此相同的问题,由于某些原因我无法解释 任何4位数字字符都是FF中的有效日期,在其他浏览器中这是NaN:
对于FF来说有点讨厌,但这对我有用:
function isDate(sDate) {
if(sDate.match(/^\d{4}$/))
return false;
var temp = new Date(sDate);
if (temp.toString() == "NaN" || temp.toString() == "Invalid Date") {
alert("Not a Date");
} else {
alert("Is a Date!");
return true;
}
}