js日期太聪明的行为

时间:2016-03-20 17:45:20

标签: javascript

通过本机JS Date对象解析日期时遇到问题。

new Date("I'm really clever date 8745")

此表达式返回有效日期,这对我来说非常令人震惊。如何防止这种特殊行为?

编辑:日期将最后一个数字解释为年...

编辑:Chrome,版本(48.0.2564.116)

编辑:预期格式为" 2016-03-20T18:05:53.485Z" (JSON stringify)

2 个答案:

答案 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))/;

完美无缺。