【问题标题】:Date Validation - how to work around Javascript's auto-correcting of dates?日期验证 - 如何解决 Javascript 的日期自动更正问题?
【发布时间】:2014-11-17 11:06:28
【问题描述】:

我想通过Javascript 验证日期并找到了这个不错的答案:

https://stackoverflow.com/a/1353711/3391783

但是当我尝试使用它来验证日期时,似乎Javascript 正在通过采用最接近的有效日期来自动更正我的日期。所以这将返回true,即使2014-11-31 不是有效日期(Javascript 月份从0 开始,所以10 等于11 月):

    function isValidDate(d) {
      if ( Object.prototype.toString.call(d) !== "[object Date]" )
        return false;
      return !isNaN(d.getTime());
    }
    
    var test_date = new Date(2014, 10, 31);
    
    console.log( test_date );
    console.log( isValidDate(test_date) );

似乎创建Date 会自动将其切换为2014-12-01,这是一个正确的日期。 但我希望能够在不更改用户输入的情况下验证它。

那么如何在Javascript 中创建无效的new Date()
还是有更简单的方法来做到这一点?

【问题讨论】:

    标签: javascript jquery validation date


    【解决方案1】:

    您可以使用 Date 对象中的自动更正功能来验证日期。只需对照 Date 对象中的内容检查输入:

    var y = 2014, m = 10, d = 31;
    
    var test_date = new Date(y, m, d);
    
    var valid =
        test_date.getFullYear() == y &&
        test_date.getMonth() == m &&
        test_date.getDate() == d;
    
    document.write(valid);

    【讨论】:

    • 哦,谢谢。这实际上是一个很酷的解决方案。 “如果 javascript 决定更改我的日期 - 它一定是错误的”:)
    【解决方案2】:

    谈到用 JavaScript 处理日期时,我是 Moment.js 的忠实粉丝。正如您在此处看到的,他们在验证日期方面做得很好:http://momentjs.com/docs/#/parsing/is-valid/

    new Date(2013, 25, 14).toString(); // "Sat Feb 14 2015 00:00:00 GMT-0500 (EST)"
    moment([2015, 25, 35]).format();   // 'Invalid date'
    

    【讨论】:

    • 谢谢。会尝试这个库,但我有点想将我的工作限制在jQuery 和纯Javascript
    【解决方案3】:

    这是我不久前编写的一个函数,用于演示 Guffa 的解决方案。

        function isValidDate(checkDate) {
        if(!/\d\d\/\d\d\/\d\d\d\d/.test(checkDate)) {
                return false; // checkDate is not formatted as ##/##/####
            } else {
                // split checkDate into three pieces
                var strMM = checkDate.split('/')[0];
                var strDD = checkDate.split('/')[1];
                var strYYYY = checkDate.split('/')[2];
    
                // create new Date() object from split pieces
                var strDateCheck = new Date(strYYYY,(strMM - 1),strDD); 
    
                // evaluate each piece of resulting date object against each corresponding piece of checkDate
                if(((strDateCheck.getMonth() + 1) == strMM) && (strDateCheck.getDate() == strDD) && (strDateCheck.getFullYear() == strYYYY)) {
                    /* if you wish, add additional validation constraints here */
                    return true; // all three pieces match exactly
                } else {
                    return false; // at least one piece did not match
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多