Javascript 检查字符串是否为日期

Javascript 检查字符串是否为日期,javascript,angular,typescript,Javascript,Angular,Typescript,我有以下字符串: a='Check 134', a='2020-01-15T10:47:54Z', a='1234', a= some object 我想检查字符串是否是日期 我试过: new Date(a) instanceof Date && !isNaN(new Date(a).getTime()) ,但对于class='Check 123',只要有数字,它就会返回true 有什么更好的解决方案 注意:我不想使用momentjs,因为项目限制您可以使用D

我有以下字符串:

a='Check 134', a='2020-01-15T10:47:54Z', a='1234', a= some object
我想检查字符串是否是日期

我试过:

new Date(a) instanceof Date &&
        !isNaN(new Date(a).getTime())
,但对于class='Check 123',只要有数字,它就会返回true

有什么更好的解决方案


注意:我不想使用momentjs,因为项目限制

您可以使用
Date.parse()
。如果它返回正值,则它有效,否则无效。例如:-

Date.parse("2020-01-15T10:47:54Z")
您可以尝试使用,然后检查是否为正数(日期>0)。 例如:

Date.parse('2020-01-15T10:47:54Z') // 1579085274000
Date.parse('123') // -23225875200000
Date.parse('Check 134') // -57938551324000

由于您已经知道要检查的日期格式,请使用may is momentjs并对照格式进行检查

var moment = require("moment");
var res = moment("Check 123", "YYYY-MM-DD", true).isValid();
console.log(res);

这是一个简单的函数,在内部使用;当您将带空格的字符串传递给
Date.parse()
时,它将忽略非数字字符并返回正数;因此,在将空格字符传递给
Date.parse()之前,需要删除空格字符

const a='Check 134';
常数b='2020-01-15T10:47:54Z';
常数c='1234';
常量='1';//从-12到13的数字是有效的
函数isValidDate(str){
//可选条件,以消除棘手的问题
//因为chrome会在字符串前加上零(000…),然后解析它
让noSpace=str.replace(/\s/g',)
if(noSpace.length<3){
返回错误
}
返回日期.parse(noSpace)>0
}
console.log(a,isValidDate(a))
console.log(b,isValidDate(b))
console.log(c,isValidDate(c))
console.log(棘手,isValidDate(棘手))
//只有铬

console.log(“'1'是”,Date.parse('1')>1,“因为它可以是”,new Date('1').toString())
可以检查字符串是否包含
。此外,我们可以添加一些条件,以使用更严格的规则来定义字符串是否为
Date

const isDate = str => {
    let [y,M,d,h,m,s] = str.split(/[- : T Z]/);
    return (y && M <= 12 && d <= 31) ? true : false;
} 
const isDate=str=>{
设[y,M,d,h,M,s]=str.split(/[-:tz]/);

return(y&&M只需使用typeof运算符,无需使用任何外部库

if (typeof date === 'object') {
    // date is object
}
if (typeof date === 'string') {
//date is string
} 

实际上,问题应该是:如何确定给定的字符串是否可以转换为真实的
Date
对象

现在,更多您不喜欢的内容可能会转换为
日期(例如,尝试
新日期(“”
新日期(0)
)。因此,您可能需要使用自己的限制来转换内容。下面是一个将输入限制为实际
日期
对象或
字符串的方法:

const canConvertToDate=trial=>
[String,Date]。包括(试用版、构造函数)和
!isNaN(新日期(试用));
log(`canConvertToDate(\``):${canConvertToDate(`)}`);
log(`canConvertToDate(\`no dice\`):${canConvertToDate(`no dice`)});
log(`canConvertToDate(新日期):${canConvertToDate(新日期)}`);
console.log(`canConvertToDate(\`2020-03-03 00:00:00\`):${
canConvertToDate(`2020-03-03 00:00:00`)}`);
log(`canConvertToDate(0):${canConvertToDate(0)}`);
console.log(`canConvertToDate(\`Wed,2020年3月11日09:27:50 GMT\`):${
canConvertToDate(`Wed,Mar 2020 09:27:50 GMT`)});
log(`canConvertToDate(new Date().toutString()):${
canConvertToDate(新日期().ToutString())}`);
log(`canConvertToDate(134):${canConvertToDate(134)}`);
//请注意浏览器的差异(Chrome/Firefox)
log(`canConvertToDate(\`134\`):${canConvertToDate(`134`)}`);

作为控制台包装{top:0;最大高度:100%!important;}
您尝试过typeof吗?是“1234”考虑到一个有效的日期……它可以被解释为UNIX时间戳,但它可能不是。你有一个更好的定义,你认为一个有效的日期?也许你想强制执行一个特定的格式使用正则表达式?我的日期是这样的:2020 01-15T10:47:54Z@Smough我找不到任何关于日期类型的内容。是关于字符串的,我的日期被认为是字符串
/\d+-\d+-\d+T\d+:\d+:\d+Z/.match(a)
..?它返回true表示日期。解析('Check 134')我也尝试过它。解析('1')返回
978307200000
@phuzi
1
在chrome v8中是一个有效日期;它甚至会在
新日期('1')中解析.toString()
并返回一个结果:)。如果在firefox(spiderMoneky)引擎中运行此命令,它不会说
1
是有效的日期。但它不符合OPs要求。日期似乎是ISO8601格式的。@phuzi实际上可以;
date.parse('1')==date.parse('001')
,因为它可以是“2001年1月1日”@CaptainMhmdrz_A有可能将1作为变量的值,在这种情况下它会中断吗?会出现边缘情况。例如,尝试
isDate(new Date().toutString())
@KooiInc是的,你是对的,但我不知道OP是否想检查这条边case@MoannaTabala当然,它将返回false,因为模式不匹配。当您知道格式时,这种方法最有效,该格式将作为函数中的第二个参数。将出现边缘情况,例如,
Check 134
@StepUp:选中(见答案)。优势是什么?我尝试使用
console.log(选中134:${canConvertToDate('Check 134'));
它返回
true
是的,这是在Chrome中,我想这是一个我们应该归档的错误。Chrome提供的字符串的日期:
Fri Jan 01 0134 00:00:00 GMT+0019(中欧标准时间)
。Firefox给出的
无效日期
已完成。然而,从字符串或几个数字进行转换是出了名的困难和不简单。因此像
isDate
这样的东西应该只是第一道防线。在这之后,明智的做法是检查转换后的
日期
是否符合您合理的预期我知道了。