Javascript 为什么新日期(“CNE-TEST-0000056”)不是无效日期?

Javascript 为什么新日期(“CNE-TEST-0000056”)不是无效日期?,javascript,node.js,date,Javascript,Node.js,Date,我正在处理报表生成模块,我正在检查每条记录中的值是否为格式化日期 var records = [{ recordNumber : "CNE-TEST-00056", name : "Test Name 1", createdAt: "2018-03-12" }, { recordNumber : "CNE-TEST-00057", name : "Test Name 2", createdAt: "2018-01-26T18:30:00.0

我正在处理报表生成模块,我正在检查每条记录中的值是否为格式化日期

var records = [{
    recordNumber : "CNE-TEST-00056", 
    name : "Test Name 1",
    createdAt: "2018-03-12"
  }, {
    recordNumber : "CNE-TEST-00057", 
    name : "Test Name 2",
    createdAt: "2018-01-26T18:30:00.000Z"
  }];
这些是我报告中的记录。每个对象中的键都是动态的,我想知道它们实际上是什么类型的

我试图通过使用下面的函数来了解类型
日期

function isDate(date){
    var date1 = new Date(date);

    if(isNaN(date1.getFullYear()) || date1.getFullYear() == 1970){
        return false;
    }

    return true;
}
当我执行
新日期(“CNE-TEST-00056”)
时,从技术上讲,它应该返回我
无效日期
新日期(“CNE-TEST-00056”)。getFullYear()
应该返回
NaN
。但它会返回太阳1956年1月1日00:00:00 GMT+0530


我怎样才能说“CNE-TEST-00056”不是日期。

对于您的具体示例,您可以使用一种简单的方法来确定它

代码片段->


这会在if语句中添加一个额外的检查,以替换所有非字母的内容并获取计数。因此,当对CNE-TEST-0057进行此操作时,计数为7,而对于2018-01-26T18:30:00.000Z,计数为2表示“T”和“Z”。这并不是完全的证据,因为像C-t-00057这样的东西会被认为是真的。我认为javascript的日期解析没有办法做到这一点,我相信这需要对您的数据进行额外检查,我已经在上面的示例中展示了这一点

也许可以升级到一些更好的包装器,如moment。js@johnSmith但是在使用moment.js格式化之前,我应该知道我使用的字段是日期。@johnSmith
moment(“CNE-TEST-000056”)。_是有效的
这给了我真实的信息。它正努力从您的输入中获取日期,“1956年”是它能够做出的唯一假设。使用
date()
构造函数从字符串解析日期是不可靠和不一致的(无论它多么流行)但是,验证日期尤其无用。如果使用内置解析器,验证日期值的唯一方法是手动解析字符串并比较结果(库可能对此有所帮助,但这不是必需的)。请在这里发布可运行的代码片段,而不是其他地方。链接腐烂。这似乎不是一个很好的测试。1970年7月23日是无效日期吗?
function isDate(date){
    var date1 = new Date(date);

    if(isNaN(date1.getFullYear()) || date1.getFullYear() == 1970 || date.replace(/[^A-Z]/gi, "").length > 2){
      return false;
    }

   return true;
 }