【问题标题】:jquery datepicker: validate datejquery datepicker:验证日期
【发布时间】:2014-12-17 14:40:33
【问题描述】:

我已经设置了一个 jquery 类:

$(function() {
            $( ".datepickerIT" ).datepicker({
                showOtherMonths: true,
                selectOtherMonths: true,
                showAnim: "clip",
                dateFormat: "dd/mm/yy",
                minDate: "01/01/1925",
                maxDate: "31/12/2050",
                changeMonth: true,
                changeYear: true,
                yearRange: "1925:2050",
                regional: "it"                      
            });
        });

我想添加一个日期检查控件,如果用户输入不是有效日期,则发出警报

如何向“.datepickerIT”类添加这样的检查?

onClose: function(dateText, inst) {
        try {
            $.datepicker.parseDate('dd/mm/yy', dateText);
        } catch (e) {
            alert(e);
        };

我必须在 head 部分包含什么插件?

【问题讨论】:

    标签: jquery jquery-ui-datepicker


    【解决方案1】:

    不建议使用Date.parse,因为不同主机解析日期字符串的方式仍有很多差异。 [1][2]

    我会使用 moment 进行日期验证。

    moment(newDate, 'DD/MM/YYYY', true).isValid()
    

    jsfiddle:http://jsfiddle.net/dw8xyzd4/

    [1]https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse [2]Why does Date.parse give incorrect results?

    【讨论】:

    • 我是否必须包含 moment.js 库才能使用它?
    • 是的,isValid 函数是 moment 对象的一部分。
    【解决方案2】:

    您可以通过以下方式验证日期(您不需要插件):-

    $(document).ready(function(){
        $("#datepicker").datepicker();
        $("#datepicker").blur(function(){
            val = $(this).val();
            val1 = Date.parse(val);
            if (isNaN(val1)==true && val!==''){
               alert("error")
            }
            else{
               console.log(val1);
            }
        });
    });
    

    Working fiddle

    更新:@Razan Paul 提到了正确的方法

    【讨论】:

    • 我在一个月的第 31 天尝试了你的小提琴和 Date.parse,除了 NaN 之外,没有这样的一天返回值。有什么解决办法吗?
    • 此方法接受无效日期。例如,2016 年 40 月 40 日的结果为 1557439200000。
    【解决方案3】:

    Date.parse() 不支持 dd/mm/yyyy 并且 datepicker getDate 在任何解析错误时将日期设置为当前日期,因此此定制检查使用 new Date(yyyy, mm, dd) 来验证转换后日期部分是否一致:

    $(function() {
        $(".datepickerIT")
            .datepicker({
                showOtherMonths: true,
                selectOtherMonths: true,
                showAnim: "clip",
                dateFormat: "dd/mm/yy",
                minDate: "01/01/1925",
                maxDate: "31/12/2050",
                changeMonth: true,
                changeYear: true,
                yearRange: "1925:2050",
                regional: "it"                      
            })
            .on('blur', function() { // This check is for dd/mm/yyyy format but can be easily adapted to any other
                if(this.value.match(/\d{1,2}[^\d]\d{1,2}[^\d]\d{4,4}/gi) == null)
                    alert('Invalid date format');
                else {
                    var t = this.value.split(/[^\d]/);
                    var dd = parseInt(t[0], 10);
                    var m0 = parseInt(t[1], 10) - 1; // Month in JavaScript Date object is 0-based
                    var yyyy = parseInt(t[2], 10);
                    var d = new Date(yyyy, m0, dd); // new Date(2017, 13, 32) is still valid
                    if(d.getDate() != dd || d.getMonth() != m0 || d.getFullYear() != yyyy)
                        alert('Invalid date value');
                }
            });
    });
    

    【讨论】:

    • 这应该是公认的答案。 cmets 中的完整性和细节确实有助于理解正在发生的事情。因为这个,我实际上更了解正则表达式。谢谢Y.B.的回答,我用过。
    • 我有一个不受欢迎的行为,点击选择器会使数据模糊并触发验证。发生这种情况是有道理的,但会降低模糊验证的灵活性。
    • 我解决了使用 .blur() 的问题,它使用 datepicker 的 onClose 事件/属性来触发验证。
    【解决方案4】:
    $(document).ready(function(){
    
    //  Check in date 
        $("#in" ).datepick({
            dateFormat: "mm/dd/yy",
            minDate:"0+1",
            maxDate: "2years",
            changeMonth:true, 
            changeYear:true,    
            onSelect:function(date_text,inst){
                var from = new Date(date_text);
                $( "#out" ).datepicker( "option", "minDate",from);
            }       
    
    
        });
    
    //  Check out date  
    
    
    
    });
    

    注意:-这里是您的字段名称,datepick 是您的插件名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多