Firefox和其他人之间的Javascript日期怪诞

Firefox和其他人之间的Javascript日期怪诞,javascript,firefox,Javascript,Firefox,有人知道为什么在Firefox中,如果您执行下面的代码,如果传入的字符串是四个数字而只有四个数字,它会将其验证为日期吗?在我测试过的每一款浏览器(比如Chrome)中,它都会以非日期返回 正如下面Marcel Korpel所指出的,由于规范规定它应该回退使用Firefox的特定于实现的回退,我真想知道为什么Firefox的回退会显示这种异常 function isDate(sDate) { var temp = new Date(sDate); if (temp.toSt

有人知道为什么在Firefox中,如果您执行下面的代码,如果传入的字符串是四个数字而只有四个数字,它会将其验证为日期吗?在我测试过的每一款浏览器(比如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!");  
    }
}

如果将字符串传递给
Date
构造函数,则该字符串应采用方法()可识别的格式(源代码:)。其他一切都会导致特定于实现的行为,并且会因浏览器而异

我建议您完全不要使用字符串,或者使用三个表示年、月和日的数字(请注意,月数从0(=一月)开始),或者使用一个数字,即自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:我想其中包含了您问题的答案:

从JavaScript 1.8.5开始,还可以解析格式化日期字符串的子集

ISO 8601页面规定(格式部分):

年份:
YYYY(如1997年)
年和月:
YYYY-MM(如1997-07)
完成日期:
YYYY-MM-DD(如1997-07-16)


因此,在依赖ISO 8601时,仅包含四个数字的字符串将被识别为年号。

我在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;  
    }
}

不要依赖javascript中的日期验证。本地日期时间格式可能会给javascript日期对象带来一些问题

使用以下方法

  • 显示不可编辑的文本框
  • 在文本框的焦点上显示日历
  • 执行空验证时,如果该字段必须为必填字段
  • 不需要执行日期验证,因为如果文本框的值不是空的,它肯定是日期。我们不允许用户输入任何其他内容,并且从日历中选择的值始终为日期:)

这适用于所有浏览器-

新日期('2001/01/31 12:00:00 AM')


请将代码缩进4个空格,不要像以前那样使用反勾号。在一个分支中返回true,在另一个分支中不返回任何内容???!?是的,我试图创建一个快速而肮脏的isDate函数,但忘了添加返回false。让我删除此讨论的返回值true。为什么要使用
toString
测试
NaN
?为什么不使用
isNaN(temp)
?我知道它是不兼容的,我只是想知道为什么Firefox会显示这种行为。@Brian:正因为如此,它的行为没有指定;根据“如果字符串不符合该格式,函数可能会退回到任何特定于实现的启发式或特定于实现的日期格式。”如果字符串未被识别为日期,
date
构造函数应返回
NaN
。只是有些浏览器比其他浏览器更宽容。我想我真的在问为什么Firefox的特定于实现的回退会返回“123”的NaN,而返回“0123”的日期。我应该编辑我的帖子来更好地限定我的问题吗?这更奇怪。那么,出于某种原因,Firefox会接受“0000”作为有效年份吗?这可能是虫子吗?啊,现在我明白了。传入字符串时,Firefox会尝试对其进行date.parse,而“1234”恰好在“123”不起作用的地方工作。非常感谢。谢谢你的解决方案!我想我也会在我的代码中使用类似的东西。你刚才给了我一个答案,为什么我的对象在我应用new Date()对象创建时失败了。当我向Firefox传递破折号“-”时,Firefox就失败了。铬不会。替换为“/”完成了工作