Javascript 无法验证以下字符串是否为有效日期

Javascript 无法验证以下字符串是否为有效日期,javascript,string,date,Javascript,String,Date,我有很多来自不同来源的不同字符串,我需要检查这些字符串中是否有有效的日期 问题在于,对于以下示例,无法检查字符串是否为有效日期: (我已经尝试了本机javascript和moment.js。无需任何操作。) 试试你想要的任何javascript框架/函数,我向你挑战,让它发挥作用。与大多数语言一样,javascript中的内置日期解析很糟糕,应该只用于琐碎的事情 您应该使用一个真正的日期库,例如 具体而言,此功能正是您需要的: 您需要指定预期的日期格式,正如我在上面所做的那样,以确保在任何环境中

我有很多来自不同来源的不同字符串,我需要检查这些字符串中是否有有效的日期

问题在于,对于以下示例,无法检查字符串是否为有效日期:

(我已经尝试了本机javascript和moment.js。无需任何操作。)


试试你想要的任何javascript框架/函数,我向你挑战,让它发挥作用。

与大多数语言一样,javascript中的内置日期解析很糟糕,应该只用于琐碎的事情

您应该使用一个真正的日期库,例如

具体而言,此功能正是您需要的:


您需要指定预期的日期格式,正如我在上面所做的那样,以确保在任何环境中输出的一致性。如果有多个可能的格式,您可以传入一个格式列表,而不是一个。

@PatrickRoberts依赖于实现的结果不是好的、一致的行为。即使使用ECMA-262中指定的格式也不可靠。@AndrewKoster感谢您提供的提示,但是,如果您使用字符串“First action required”,它会说这是一个有效日期。再说一次,这真的很奇怪,我不能测试世界上的任何字符串,一定有办法让它正确。@AlessandroCatania我刚刚更新了我的答案。您希望在日期格式之后指定第三个参数,说明是否使用严格解析。不确定为什么它默认为非严格,但这解决了您指定的特定字符串的问题。对于实际的严格解析,它应该适用于所有字符串。@PatrickRoberts如果不指定严格解析,则本机
Date()
解析就是它的归宿。如您所见,即使指定了日期格式,也会认为像
“需要第一个操作”
这样的完整无意义字符串是有效的。根据最合理的定义,这不是“好的”,尽管它可能是“一致的”,甚至是不好的。@RobG您有任何证据表明,将输入限制为指定的格式会导致不符合的行为吗?如果是这样,我将收回我的声明。
const moment = require('moment');
const expectedDateFormat = ['DD-MM-YYYY','YYYY-MM-DD', moment.ISO_8601];

const examples = ['2019-03-31','2018-04-09T12:37:28Z','2013-02-04T22:44:30.652Z','28-10-2019','HAVTD-123224','HAVLF200974','1st action required','"$1445":3','On the night of Thursday May 17 2018 at 20:52 the vehicle was travelling Nord-Wesr when the impact occurred','HAVLF200323','HAVLF201037','HAVTD200110'];

const isValidDate = (string) => {
    const date = moment(string, expectedDateFormat)
    return date.isValid()
}

console.log('-----TRUE-----');
for (var i = 0; i< examples.length; i++) {
if(i == 4) 
console.log('-----FALSE-----');
    console.log(`${examples[i]} //`, isValidDate(examples[i]));
}


-----TRUE-----
2019-03-31 // true
2018-04-09T12:37:28Z // true
2013-02-04T22:44:30.652Z // true
28-10-2019 // true
-----FALSE-----
HAVTD-123224 // false
HAVLF200974 // true
1st action required // true
"$1445":3 // true
On the night of Thursday May 17 2018 at 20:52 the vehicle was travelling Nord-Wesr when the impact occurred // true
HAVLF200323 // true
HAVLF201037 // true
HAVTD200110 // true
const moment = require('moment')

const expectedDateFormat = "MM-DD-YYYY"

const example1 = '"$1445":3'
const example2 = 'HAVTD-123224'
const example3 = '10-28-2019'
const example4 = '1st action required'

const isValidDate = (string) => {

    const isStrict = true

    const date = moment(string, expectedDateFormat, isStrict)
    return date.isValid()
}

console.log("isValidDate example1", isValidDate(example1)) //false
console.log("isValidDate example2", isValidDate(example2)) //false
console.log("isValidDate example3", isValidDate(example3)) //true
console.log("isValidDate example4", isValidDate(example4)) //false