Date.parse 在 FF 和 Chrome 中表现不同

Date.parse behaving differently in FF and Chrome

我有一个 jquery 日期选择器分配给一个 textfield.The 文本字段是不可编辑的,只有退格键可以用于删除日期。我使用以下代码检查该字段是否有效 date.This 在 mozilla 中完美运行,但在 chrome.

中却不行
<input type="text" class="date_field from_date" name="from_date" placeholder="From date">

//datepicker
$(".from_date").datepicker({
    dateFormat: "yy-mm-dd"
});
//only backspace keypress allowed
$(".date_field").keydown(function (e) {
    if (e.keyCode != 8) {
        e.preventDefault();
    }

});

//check the date is valid.
//For example('2015-09-' is the value of textfield)
alert(Date.parse($('.from_date').val()));
//returns NaN in mozilla,but returns number in chrome
if (Date.parse($('.from_date').val())) {
    //do the rest code
}

来自the spec

The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String. The function first attempts to parse the format of the String according to the rules (including extended years) called out in Date Time String Format (20.3.1.16). If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats.

(我的重点)

在这种情况下,Chrome 采用了启发式方法,即缺少一天等于该月的第一天,因此它将“2015-09-”识别为 9 月的第一天。它还会做一些其他有趣的事情,比如将“2015-09-31”视为 10 月 1 日。 (这在很大程度上与 JavaScript 的 Date 自动处理翻转的方式一致。)

如果你想验证格式,你必须使用不会尝试应用特定于实现的启发式方法的东西来验证。例如:

if (dateString.test(/^\d{4}-\d{2}-\d{2}$/) {
    // It's in ####-##-## format. Still may not be valid, you can do more checking if necessary
}