正则表达式,有效日期时间(ddHHmmZ MMM yy)

时间:2014-04-09 16:20:31

标签: javascript jquery regex

我正在寻找一种以下列格式验证日期/时间格式的方法:

  • ddHHmmZ MMM yy(例如:091603Z Apr 14

验证程序必须只接受有效的日期时间。

我有以下regEx:

var militaryDateTime =
    /^\s*(\d{1,2})(\d{1,2})(\d{1,2})[zZ]{1}\s+([a-zA-Z]{3})\s+(\d{2})\s*$/;

以上仅验证日期时间的字母/数字块位于正确的位置。如何扩展此项以检查有效日期/时间?

3 个答案:

答案 0 :(得分:3)

您可以使用第三方库来验证日期格式,而不是制作复杂的正则表达式。我会建议MomentJS。

var format = "DDHHmm MMM YY";
var dates = [
    "091500 Jan 14", // Valid date
    "321500 Jan 14", // Invalid day
    "092500 Jan 14", // Invalid hour
    "091561 Jan 14", // Invalid minute
    "091500 LOL 14"  // Invalid month
];

for(var i in dates) {
    if(moment(dates[i], format).isValid()){
        alert("\"" + dates[i] + "\" is valid");
    } else {
        alert("\"" + dates[i] + "\" is not Valid");
    }
}

我发布了一个现场演示来摆弄:http://jsfiddle.net/txHnt/1/

答案 1 :(得分:1)

没有任何插件或库的最佳方法是首先通过RegEx获取所有日期时间组件,以测试输入字符串是否在第一时间正确格式化:

var test_str = '091603Z Apr 14';
var date_matches = test_str.match(/^(\d{2})(\d{2})(\d{2})Z (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{2})$/);
// date_matches = ["091603Z Apr 14", "09", "16", "03", "Apr", "14"];

然后解析Date.parse可以正确解析的格式正确/编译的字符串:

var s = Date.parse(date_matches[4] + ' ' + date_matches[1] + ', ' + date_matches[5] + ' ' + date_matches[2] + ':' + date_matches[3]);
// s = 1397073780000;

只是为了确保我们使用格式正确的字符串来解析日期:

var date = new Date(1397073780000);
// date = Wed Apr 09 2014 16:03:00 GMT-0400 (EDT)

如果原始字符串无效,则Date.parse会返回NaN,因此您只需使用isNaN()进行测试。

答案 2 :(得分:0)

使用正则表达式检查语义肯定不会起作用,如果确实如此,那肯定是代码维护者的地狱。

您的日期时间包含月份和年份的日期。这意味着您必须考虑到闰年条件才能正确解释2月29日。因此,您应该重新考虑是否真的需要并希望使用正则表达式来完成工作,因为模式将变得非常复杂且接近于无法维护。

如果你真的想雇佣,你可以尝试以下一个作为开始(忽略2月29日):

var militaryDateTime =
    /^\s*(
         ((0[1-9]|1[0-9]|2[0-8])([01][0-9]|2[0-3])[0-5][0-9][zZ]\s+Feb                          \s+[0-9]{2})
        |((0[1-9]|2[0-9]|30)    ([01][0-9]|2[0-3])[0-5][0-9][zZ]\s+(Apr|Jun|Sep|Nov)            \s+[0-9]{2})
        |((0[1-9]|2[0-9]|3[01]) ([01][0-9]|2[0-3])[0-5][0-9][zZ]\s+(Jan|Mar|May|Jul|Aug|Oct|Dec)\s+[0-9]{2})
     )\s*$/;

当然你必须将它包装成一行并删除空格,因为js regex不支持正则表达式的人类可读的词汇化。

注意:
您是否知道SO有一个针对最常见的正则表达式相关问题的门户页面?  The regex FAQ/Reference/WiKi page