【问题标题】:Not throwing exception while passing wrong date in javascript在javascript中传递错误日期时不抛出异常
【发布时间】:2016-09-11 16:29:31
【问题描述】:

我试图检查日期(以 MM/dd/yyyy 格式)是否是 javascript 中的有效日期。但是在传递错误的日期时,它无法区分。 我使用下面的逻辑来检查它是否是一个有效的日期。

var dt = document.forms["registerForm"]["dateOfBirth"].value;
    try{
        var d = new Date(dt);
        alert(d);
    }catch(err){
        alert("not a valid date");
        return false;
    }

虽然 dateOfBirth 是“02/47/2016”,但它不会进入异常块,而是将“02/47/2016”解释为 Fri Mar 18 2016 00:00:00 GMT+0530 (IST) .但是当我尝试使用“02/03/2016”时,它正确解释为 Wed Feb 03 2016 00:00:00 GMT+0530 (IST)。

【问题讨论】:

标签: javascript


【解决方案1】:

Date 构造函数获取日期值并将该天数减去 1 加到该月的第一天,这解释了您获得的结果日期。

使用像momentjs 这样的库可以让处理日期变得更加轻松,但是如果您想在没有其他库的情况下执行此操作,那么您可以使用下面的函数。如果Date 构造函数返回一个日期对象,该函数将把该日期格式化回字符串,并将其与原始输入进行比较。如果它们不匹配,函数将返回undefined,就像发生异常时一样。如果它们匹配,则返回日期对象:

function getDate(d) {
    function formatDate(d) {
        return [d.getMonth() + 1, d.getDate(), d.getFullYear()]
               .map( n => (n < 10 ? '0' : '') + n ).join('/');
    }
    try {
        var d = new Date(dt);
        if (formatDate(d) != dt) return; // invalid
        return d;
    } 
    catch(err){}
}

var dt = '02/47/2016';
console.log(dt, getDate(dt) !== undefined);
var dt = '02/03/2016';
console.log(dt, getDate(dt) !== undefined);

【讨论】:

    【解决方案2】:

    当用户在表单中输入日期时强制执行一些结构,例如月/日/年。如果不这样做,您最终可能会得到一个日期,例如 2016 年 2 月 10 日,这可能是 2 月 10 日或 10 月 2 日,具体取决于国家/地区。

    过去,除非您必须精益,否则请使用moment.js 进行验证,例如

    alert(moment("02/10/2016", 'MM/DD/YYYY',true).isValid()); //true
    

    【讨论】:

    • 是的使用时刻。你会保持理智。
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多