如何验证字符串值是否是可解析的日期格式?

How to validate whether a string-value is a parsable date-format?

我是运行下面的代码,检查字符串是否是日期。我的输入值之一是 'text',其中 returns 是 NaN 值,但我的 if 子句没有按预期工作。

function isDate(myDate) {
  console.log('myDate = ' + myDate);
  return Date.parse(new Date(myDate));
}

// var date1 = '1/5/22'; // good date
var date1 = 'test'; // bad date

var whatDate = isDate(date1);

console.log('date = ' + whatDate);

if (whatDate == 'NaN') {
  console.log('bad date');
} else {
  console.log('good date');
}

你就快完成了:

if(whatDate == 'NaN'){
    log.debug('bad date');
}else{
    log.debug('good date');
}

不要将 whatDate'NaN' 进行比较,而是使用函数 isNaN():

if(isNaN(whatDate)){
    log.debug('bad date');
}else{
    log.debug('good date');
}

或者,如果您真的想与 'NaN' 进行比较,您首先必须将 whatDate 转换为字符串:

if((whatDate + "") == 'NaN'){
    log.debug('bad date');
}else{
    log.debug('good date');
}

是一种可能。另一种方式是

if(whatDate.toString() == 'NaN'){
    log.debug('bad date');
}else{
    log.debug('good date');
}

在您的 if 语句中,您正在检查 whatDate 是否等于字符串“NaN”。 what 你想检查 whatDate 是否是一个数字。

你可以试试

if (isNaN(whatDate))

下面的答案,除了已经解释过的关于如何检测 NaN 值的内容之外,还想进一步深入。

一个检查或测试函数,特别是如果它的名称中还带有 前缀 is 应该始终 return 完全 布尔值.

  • 因此 OP 首先会以用户期望的方式实现这样的功能。
  • 其次,OP 在测试函数的实现中只处理了一次NaN问题

编辑 根据并感谢 RobG

的澄清

...和... 根据 ECMAScript 的规范 instantiating a Date object,传递给构造函数的参数将被解析并分配给内部 thisTimeValue插槽。后者的数字类型是不可解析(无效)参数的 NaN 值。

任何 valueOf 相关操作都会 return 内部 thisTimeValue 槽的值。

任何 toString 相关操作都会根据后一个值计算日期字符串格式。对于 NaNthisTimeValue,returned 字符串值必须是 'Invalid Date'.

因此验证/测试实施可能类似于...

function isParsableDateRepresentative(...args) {
  return String(new Date(...args)) !== 'Invalid Date';
}

...但最好它应该更接近下一个提供的...

function isParsableDateRepresentative(...args) {
  return !Number.isNaN(new Date(...args).valueOf());
}

测试:

function isParsableDateRepresentative(...args) {
  return !Number.isNaN(new Date(...args).valueOf());
}

console.log('new Date("1/5/22") ...', new Date("1/5/22"));
console.log(
  'isParsableDateRepresentative("1/5/22") ...',
  isParsableDateRepresentative("1/5/22")
);
console.log('\nnew Date("test") ...', new Date("test"));
console.log(
  'isParsableDateRepresentative("test") ...',
  isParsableDateRepresentative("test")
);
console.log('\nnew Date(new Date("test")) ...', new Date(new Date("test")));
console.log(
  'isParsableDateRepresentative(new Date("test")) ...',
  isParsableDateRepresentative(new Date("test"))
);

console.log('\nnew Date() ...', new Date());
console.log(
  'isParsableDateRepresentative() ...',
  isParsableDateRepresentative()
);
console.log('\nnew Date(null) ...', new Date(null));
console.log(
  'isParsableDateRepresentative(null) ...',
  isParsableDateRepresentative(null)
);
console.log('\nnew Date(undefined) ...', new Date(undefined));
console.log(
  'isParsableDateRepresentative(undefined) ...',
  isParsableDateRepresentative(undefined)
);
console.log('\nnew Date("") ...', new Date(""));
console.log(
  'isParsableDateRepresentative("") ...',
  isParsableDateRepresentative("")
);
.as-console-wrapper { min-height: 100%!important; top: 0; }