确定字符串是Date还是Number

Determine if string is Date or Number

本文关键字:还是 Number Date 字符串      更新时间:2023-09-26

我正在尝试确定字符串是数字还是日期。

这是我的代码:

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

你知道如何摆脱这种循环吗?

所以发生的事情被称为强制。由于javascript是动态类型,当你给它两种不同的类型时,js引擎会试图将其中一种类型强制为合理的类型或它认为你的意思。

例如:

isNan("37"); is false because "37" is converted to the number 37

isNaN(new Date())返回false(日期是数字)

它将Date转换为数字,因此这是正确的。

但是,根据浏览器和提供的值,ECMA-262定义的未识别为ISO格式的日期字符串中的无效值可能会也可能不会导致NaN

所以

new Date('23/25/2014'); // NON-ISO string with invalid date values

因此,这将在所有符合ES5及更高版本的浏览器中返回NaN。

为了进行更严格的检查,您可以使用:

Number.isNan(new Date()); // This should return true

因此,为了重述,请确保日期符合ISO标准,否则将是NaN,并使用更严格的检查。希望这能有所帮助。

一般来说,从Javascript设计的角度来看,我认为你不能通过设计来做到这一点。从8640000000000000到数字8640000000000000中最早日期之间的任何数字都可以转换为日期(表示为1970年1月1日UTC后的时间(以毫秒为单位))。

因此,任何不在此范围内下降的数字都不能是日期。任何落在范围内的数字都是有效的日期或数字,您必须使用上下文来确定是要将其解释为数字还是日期。

然而,您可以做一个简单的实现来测试数字是否是有效日期,但这是您能做的最好的事情,不需要上下文。

确定一个日期是否是一个数字可能会更容易一些。因为人类可读的日期表示将通过isNaN()返回true,从而确定它绝对不是数字。然后,您将继续检查该字符串是否为日期,这是您在函数中已经做过的。