我正在寻找一种以下列格式验证日期/时间格式的方法:
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*$/;
以上仅验证日期时间的字母/数字块位于正确的位置。如何扩展此项以检查有效日期/时间?
答案 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