【问题标题】:How to validate whether a string-value is a parsable date-format?如何验证字符串值是否是可解析的日期格式?
【发布时间】:2022-01-13 22:06:11
【问题描述】:

我正在运行下面的代码,检查字符串是否为日期。我的输入值之一是 'text',它返回 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');
}

【问题讨论】:

  • NaN 不是字符串。使用Number.isNaN(whatDate)
  • 检查或测试函数,特别是如果它的名称中还带有前缀is,则应始终仅返回一个布尔值。因此,OP 首先会以用户期望它工作的方式实现这样的功能。其次,OP 在测试函数的实现中确实处理了一次 NaN 问题。
  • Date.parse(new Date(myDate)) 中,Date.parsenew Date 都是多余的。除非您知道该值是 ECMA-262 支持的格式(本质上是 ISO 8601 或 toString 生成的格式),否则您永远不应该将解析留给内置解析器。

标签: javascript date datetime validation parsing


【解决方案1】:

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

你可以试试

if (isNaN(whatDate))

【讨论】:

  • whatDate === NaN 这不起作用,因为NaN 是特殊的,因为NaN 永远不会等于自己(NaN === NaN 给出false)。
  • 好像是这样。我检查了控制台 :D 并对其进行了编辑。永远不必写 NaN == NaN
【解决方案2】:

你快到了:

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');
}

【讨论】:

  • 您可能想检查new Date(NaN).toString() 的结果。这不是“NaN”。
【解决方案3】:

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

一个检查或测试函数,特别是如果它的名称中还带有前缀is应该总是返回一个布尔

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

编辑根据并感谢RobG

的澄清

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

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

任何与toString 相关的操作都会根据后一个值计算日期字符串格式。对于thisTimeValueNaN,返回的字符串值必须是'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; }

【讨论】:

  • Re "返回值是一个 Date 对象,内部字符串值为 'Invalid Date'" 不。 Date 对象只有一个内部值,它是一个有效的 time valueNaN 数字,它不是字符串。如果时间值NaN,则字符串“Invalid Date”由Date.prototype.toString生成。
  • PS,String(new Date(...args)) !== 'Invalid Date'; 会比isNaN(new Date(...args)) 简单得多。但是,字符串被解析为有效时间值的事实并不意味着它被正确解析,或者它是有效日期,或者在其他实现中相同的字符串将被解析为相同的时间值。 :-)
  • @RobG ...感谢您的澄清,多年来我一直错误地认为Date 实例始终在内部已经将两个代表作为值,thisTimeValue 数字类型(这将与例如valueOf) 和抽象ToDateString 操作的相应字符串值一起返回。但是我错了。任何与toString 相关的返回值都会在现场计算。
  • @RobG ...我根据您的说明编辑/更正了我的答案。再次感谢您以真正专业的方式指出我缺乏理解。
猜你喜欢
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多