通过本机JS Date对象解析日期时遇到问题。
new Date("I'm really clever date 8745")
此表达式返回有效日期,这对我来说非常令人震惊。如何防止这种特殊行为?
编辑:日期将最后一个数字解释为年...
编辑:Chrome,版本(48.0.2564.116)
编辑:预期格式为" 2016-03-20T18:05:53.485Z" (JSON stringify)
答案 0 :(得分:2)
如果你打算"匹配"任何有效的日期(例如圣诞节......),都远非简单。如果你想只允许一些格式类型,我会选择正则表达式。这里有一个简单的不太广泛的例子:
function isprobablyavaliddate(str){
var allowed = /\d{4}[\\\/-]{1}\d{2}[\\\/-]{1}\d{2}/
//example allowed date formats: yyyy-mm-dd, yyyy/mm/dd
return allowed.test(str)
}
var testString = "I'm really clever date 8745"
//catch valid string before doing anything with a date...
if ( isprobablyavaliddate(testString) ) mydate = new Date(testString)
else ...
代表编辑中要求的有效格式:/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z/
(^
用于匹配首字母)
答案 1 :(得分:0)
如果字符串是有效的ISO日期,我使用正则表达式进行测试。
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/;
完美无缺。