2

我有一个带有 jQ​​uery UI Datepicker 的表单,然后使用 jQuery Validation 插件对其进行验证。

日期选择器是使用以下方法创建的:

$("#dob").datepicker({
        changeMonth: true,
        changeYear: true,
        dateFormat: "dd/mm/yy",
        onSelect: function (){
            this.focus();   
        },
    });

但是,当我要求它使用 dd/mm/yyyy 进行验证时,验证插件似乎以美国格式进行验证。这意味着任何一个月的 12 日之后的任何日期都被视为无效。

我环顾四周,发现了一种添加不同方法来使用正则表达式验证日期的方法:

$.validator.addMethod(
    "australianDate",
    function(value, element) {
        return value.match(/^(0?[1-9]|[12][0-9]|3[01])\/(0?[1-9]|1[012])\/((19|20)\\d\\d)$/);
    },
    "Please enter a date in the format dd/mm/yyyy."
);

然后将其添加到规则中:

        dob:{
             required:true,
             australianDate: true
        },

但这对于任何输入似乎仍然失败。

我正在使用的正则表达式是我过去在 php 中使用过的,它比通用 (any2numbers/any2numbers/any4numbers) 表达式更准确,我也希望能够在 javascript 中使用它。

javascript 正则表达式是否需要与 php 采用不同的格式?那是我要去错的地方吗..

任何帮助是极大的赞赏。

4

3 回答 3

1

只是一个评论:

更好的日期验证功能是:

// Expects date string in format dd/mm/yyyy
function isValidDate(s) {
  if (s === null || s.length !== 10) {
    return false;
  }
  s = s.split('/');
  var d = new Date(s[2], --s[1], s[0]);
  return d.getFullYear() == s[2] && d.getDate() == s[0];
}
于 2012-11-28T04:49:32.747 回答
0
^(((((0[1-9])|(1\d)|(2[0-8]))\/((0[1-9])|(1[0-2])))|((31\/((0[13578])|(1[02])))|((29|30)\/((0[1,3-9])|(1[0-2])))))\/((20[0-9][0-9])|(19[0-9][0-9])))|((29\/02\/(19|20)(([02468][048])|([13579][26]))))$  

试试上面的模式,我希望它会起作用

于 2012-11-28T04:57:18.663 回答
0

感谢您的输入。虽然这两个答案都有效,但他们没有验证闰年或 2 月必须是最大 28/29 之类的东西。

我不停地环顾四周,设法找到了另一个 jquery 插件,简称为date.js

链接后,您只需调用该Date.parseExact函数:

jQuery.validator.addMethod("australianDate", function(value, element) { 
    return Date.parseExact(value, "d/M/yyyy");
}, "Please enter a valid date in the format dd/mm/yyyy.");

验证闰年和我正确测试过的所有其他内容。

于 2012-12-04T21:58:58.547 回答