问题描述
我看过很多关于此的文章,但还没有找到我想要的东西。
我正在尝试简单地检查字符串是否是日期。该字符串可能包含一个数字,例如 2012 。
var timestamp = Date.parse('foo 2012');
if (isNaN(timestamp) == false) {
var d = new Date(timestamp);
console.log('DATE',d)
}else{
console.log('TEXT');
}
//输出:日期:2012年1月1日,星期日,格林尼治标准时间+1100(澳大利亚东部夏令时)
- 为什么javascript将 foo 2012 转换为明显不是日期的日期?
- 如何验证我的字符串是实际日期?
解决方法
字符串永远不是日期。
字符串可以表示一个日期。有很多方法可以通过不同的字符串格式表示相同的日期。
这意味着“验证字符串是日期”是不可能完成的任务。您可以做的是:
- 验证字符串的格式是否符合某些众所周知的格式,并且其内容有效。
- 尝试将给定的字符串解析为预期的格式,并抛出错误或返回“ guard”值以指示解析未成功。
JavaScript采用了第三个选项,与选项2相似,只不过它返回一个值,该值指示其在处理垃圾输入方面的“最大努力”。这显然就是为什么它在您的字符串中显示了一年并决定“好吧,我想我可以为此约会了?”的原因。正如@Pointy所指出的,实际上是在规范中,如果JavaScript字符串与两种支持的格式之一都不匹配,则实现者可以决定结果是什么。
我强烈建议您在处理日期字符串时,应坚持使用一致的格式。我是ISO 8601日期/时间字符串的忠实拥护者,因为它们可以识别时区,易于排序并且受到广泛支持(包括易于由JavaScript解析)。如果您要求字符串采用标准格式,则执行查找A RegExp that can validate the input之类的事情会更容易。