确定字符串是否为日期或数字

时间:2016-04-20 00:18:50

标签: javascript date

我试图确定字符串是数字还是日期。

这是我的代码:

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(日期是数字)。

关于如何摆脱这种循环的想法?

2 个答案:

答案 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(),从而确定它绝对不是数字。然后你会继续检查该字符串是否是一个日期,你已经在你的函数中做了。