我有一些验证日期的代码:
function validateForm() {
var errFound = 0;
//var patt_date = new RegExp("^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))$");
var patt_date = new RegExp("^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$");
if (patt_date.test(document.getElementById("datefrom").value) == false){errFound = errFound + 1;document.getElementById("datefrom").className = "error";}
if (errFound > 0)
alert('Please correct red colored field!');
else
return true;
return false;
}
以上代码应使用YYYY-MM-DD格式,但无法验证日期,例如“2009-02-29”
评论代码应该(// var patt_date = new RegExp ...),它可以捕获“2009-02-29”,
但是当我输入无效数据并尝试纠正它时,它会破坏验证,在我纠正它们后,它会一直抱怨表单值有问题(特别是在有多个输入的表单上)
也许有人可以修复当前的正则表达式?
<小时/> 已编辑,我只想简单替换上面的正则表达式,意味着新的正则表达式模式不是验证日期的全新方法
使用 2009-02-29 进行测试,第一个链接工作&amp;第二不是。同样问题只是第二个正则表达式没有检测到值 2009-02-29 无效而第一个可以(但它毁了我的代码?所以它一定是有问题的。)
谢谢,
德尔斯
答案 0 :(得分:8)
不要使用正则表达式进行整个日期验证,这确实推动了regexp的设计限制。我会建议这个程序:
/^\d{4}-\d{2}-\d{2}$/
substr()
提取年,月和日并转换为整数if
语句来验证整数。像这样:if (month == 2) { if (day == 29) { if (year % 4 != 0 || year % 100 == 0 && year % 400 != 0) { // fail } } else if (day > 28) { // fail } } else if (month == 4 || month == 6 || month == 9 || month == 11) { if (day > 30) { // fail } } else { if (day > 31) { // fail }
(当然可以更简洁地编写)或者,您可以使用Javascript的Date
类执行此验证 - 您可能需要执行诸如解析日期,将其转换回字符串以及检查是否这两个字符串相等。 (我不是Javascript专家)
答案 1 :(得分:3)
我在这方面与大卫达成一致......正则表达式匹配不应被用作判断通过日期是否有效的独家标准。 Javascript验证中的常规过程涉及几个步骤:
一个。第一步是确保传递的字符串与期望的日期格式匹配,方法是将其与正则表达式进行匹配。以下可能是更严格的正则表达式。
// Assuming that the only allowed separator is a forward slash.
// Expected format: yyyy-mm-dd
/^[12][90][\d][\d]-[0-3]?[\d]-[01]?[\d]$/
湾第二步是将字符串解析为Date对象,该对象返回no。自1970年以来的毫秒数。使用此数字作为Date构造函数的参数。
℃。由于JS会自动将传递的日期翻转到最接近的有效值,因此您仍然无法确定创建的Date对象是否与传递的匹配。要确定是否发生这种情况,最好的方法是根据分隔符拆分传递的字符串,并比较各个日期组件:
// d is the created Date object as explained above.
var arrDateParts = inputDate.split("-");
if ((d.getFullYear() == arrDateParts[0]) && (d.getMonth() == arrDateParts[1]) && (d.getDate() == arrDateParts[2]))
return true;
else
return false;
答案 2 :(得分:-1)
此javascript代码完全验证日期。您可以将其复制并在浏览器中进行测试。
var regDate = '^(19[0-9]{2}|2[0-9]{3})-(0[1-9]{1}|1[0-2]{1}){1}-(0[1-9]|(1|2)[0-9]|3[0-1]){1}$';
var txt='2010-01-31';
if(txt.match(regDate))
{
alert('date match');
}