我试图确定字符串是数字还是日期。
这是我的代码:
this._getFieldFormat = (value) => {
// check if is date
let d = new Date(value);
if (!isNaN( d.getTime() ) ) {
return 'date';
}
// check if is boolean
// isNaN(false) = false, false is a number (0), true is a number (1)
if(typeof value === 'boolean'){
return 'boolean';
}
// check if a string is a number
if(!isNaN(value)){
return 'number';
}
return typeof value;
};
适用于以下日期:2016-04-19T23:09:10.208092Z
。
问题是1
看起来是有效日期(Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
)而isNaN(new Date())
是返回false
(日期是数字)。
关于如何摆脱这种循环的想法?
答案 0 :(得分:1)
所以发生的事情叫做强制。由于javascript是动态类型,当你给它两种不同的类型时,js引擎会尝试将其中一种类型强制转换为合理的或者它的意思。
例如:
Consumer<A> partial = ((Consumer<A>) A::doSomething).andThen(A::doAnotherThing);
isNaN(new Date())返回false(日期是数字)
它将Date转换为数字,所以这是正确的。
但是,日期字符串中的无效值未被识别为ECMA-262定义的ISO格式可能会也可能不会导致NaN,具体取决于浏览器和提供的值
所以
isNan("37"); is false because "37" is converted to the number 37
因此,这将在符合ES5及更高版本的所有浏览器中返回NaN。
另外,为了进行更严格的检查,您可以使用:
new Date('23/25/2014'); // NON-ISO string with invalid date values
因此,请回顾一下,确保日期符合ISO标准,否则它将是NaN并使用更严格的检查。希望这会有所帮助。
答案 1 :(得分:0)
总的来说,从Javascript设计的角度来看,我并不认为你可以通过设计来实现。 8640000000000000之间的任何数字和最早的数字-8640000000000000都可以转换为日期(表示为UTC时间1970年1月1日的时间,以毫秒为单位)。
因此,任何不落的数字都是这个范围不能是日期。任何落在范围内的数字都是有效日期或数字,您必须使用上下文来确定是否要将其解释为数字或日期。
然而,你可以做一个天真的实现来测试数字是否是一个有效的日期,但这是你能做的最好的,没有上下文。
确定日期是否为数字可能会更容易一些。因为人类可读的日期表示将true
返回isNaN()
,从而确定它绝对不是数字。然后你会继续检查该字符串是否是一个日期,你已经在你的函数中做了。