Javascript JS日期验证增强
我继承了以下脚本,需要对其进行一些改进。该函数检查是否只输入了允许的字符(0123456789/),然后将输入为1/1/12的日期格式化为2012年1月1日。稍微调整一下,这部分就可以正常工作了。我现在需要进一步验证,如果省略了年份,则添加年份。这意味着如果用户输入1/1,则需要对其进行格式化并添加当前年份(例如,2012年1月1日) 用户输入和所需(工作)输出示例Javascript JS日期验证增强,javascript,validation,date,Javascript,Validation,Date,我继承了以下脚本,需要对其进行一些改进。该函数检查是否只输入了允许的字符(0123456789/),然后将输入为1/1/12的日期格式化为2012年1月1日。稍微调整一下,这部分就可以正常工作了。我现在需要进一步验证,如果省略了年份,则添加年份。这意味着如果用户输入1/1,则需要对其进行格式化并添加当前年份(例如,2012年1月1日) 用户输入和所需(工作)输出示例 a/a/a错误警报用户-检查 2010年1月2日将输入字段更新为2010年3月1日 2012年1月1日将输入字段更新为2012年
- a/a/a错误警报用户-检查
- 2010年1月2日将输入字段更新为2010年3月1日
- 2012年1月1日将输入字段更新为2012年1月1日
- 1/10/2将输入字段更新为01/10/2002
function ValidateDate(obj)
{
/************************************************
DESCRIPTION: Validates that a string contains only
valid dates with 2 digit month, 2 digit day,
4 digit year. Date separator has to be /
Uses combination of regular expressions and
string parsing to validate date.
Ex. mm/dd/yyyy
PARAMETERS:
ValidateDate(strValue) - String to be tested for validity
RETURNS:
True if valid, otherwise false.
REMARKS:
Avoids some of the limitations of the Date.parse()
method such as the date separator character.
*************************************************/
var checkOK = "0123456789/";
var checkStr = obj.value;
var allValid = true;
var p = /(\d{1,2})\/(\d{1,2})\/(\d{1,4})/;
var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
// check to see if valid characters were used
for (i = 0; i < checkStr.length; i++)
{
ch = checkStr.charAt(i);
for (j = 0; j < checkOK.length; j++)
if (ch == checkOK.charAt(j))
break;
if (j == checkOK.length)
{
allValid = false;
break;
}
}
if (!allValid)
{
alert("Please use only a combination of " + checkOK + "\'s charaters in the date field. Dates should be entered in the format of mm/dd/yyyy.");
setTimeout((function() { obj.select() }), 0);
return (false);
}
// converts to mm/dd/yyyy format
if (!obj.value.match(p)) return;
num=new Array();
num=obj.value.match(p);
if (num[1].length == 1) num[1]="0" + num[1];
if (num[2].length == 1) num[2]="0" + num[2];
if (num[3].length == 1) num[3]="200" + num[3];
if (num[3].length == 2) num[3]="20" + num[3];
obj.value= num[1] + "/" + num[2] + "/" + num[3];
//check to see if in correct format
if(!objRegExp.test(obj.value))
{
alert('The date entered is not properly formatted.');
return false; //doesn't match pattern, bad date
}
else{
var arrayDate = obj.value.split(RegExp.$1); //split date into month, day, year
var intDay = parseInt(arrayDate[1],10);
var intYear = parseInt(arrayDate[2],10);
var intMonth = parseInt(arrayDate[0],10);
//check for valid month
if(intMonth > 12 || intMonth < 1) {
alert('The date entered is invalid');
return false;
}
//create a lookup for months not equal to Feb.
var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
'08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
//check if month value and day value agree
if(arrayLookup[arrayDate[0]] != null) {
if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
return true; //found in lookup table, good date
}
//check for February
var booLeapYear = (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0));
if( ((booLeapYear && intDay <= 29) || (!booLeapYear && intDay <=28)) && intDay !=0)
return true; //Feb. had valid number of days
}
alert(obj.value + ' is not a valid date.');
// return false; //any other values, bad date
}
功能验证日期(obj)
{
/************************************************
描述:验证字符串是否仅包含
有效日期,包括两位数的月份、两位数的日期、,
4位年份。日期分隔符必须为/
使用正则表达式和
字符串解析以验证日期。
年月日前
参数:
ValidateDate(strValue)-要测试有效性的字符串
返回:
如果有效,则为True,否则为false。
评论:
避免了Date.parse()的一些限制
方法,例如日期分隔符字符。
*************************************************/
var checkOK=“0123456789/”;
var checkStr=对象值;
var allValid=true;
var p=/(\d{1,2})\/(\d{1,2})\/(\d{1,4})/;
var objRegExp=/^\d{1,2}(\-\124;\/\\)\ d{1,2}\1\d{4}$/;
//检查是否使用了有效字符
对于(i=0;i12 | | intMonth<1){
警报(“输入的日期无效”);
返回false;
}
//为不等于2月的月份创建查找。
变量arrayLookup={'01':31,'03':31,'04':30,'05':31,'06':30,'07':31,
'08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
//检查月值和日值是否一致
if(arrayLookup[arrayDate[0]!=null){
如果(intDay某些指向对象的点:
- 您不必检查有效字符,因为您的匹配regexp已经需要它们。如果确实需要,请使用
/^[\d\/]*$/.test()
,而不是该循环
- 要匹配像1/1这样的日期,使用
/\d{1,2}\/\d{1,2}(\/\d{1,4})/
作为p
,只需执行num=obj.value.split(“/”)
而不是匹配组
- 要验证日期,请查看
- 您还应该允许ISO日期格式YYYY-MM-DD,该格式由
date()
这些都是很好的观点,但在使用正则表达式时,我们看到字符没有被抓到。客户希望她的团队使用相同的格式,特别是因为他们应该从另一个来源复制日期并粘贴。他们的团队负责人不希望他们键入日期以帮助减少拼写错误的机会(如果他们在复制和粘贴,我们不会看到字符出现,但我离题了)。呃,从另一个来源提取日期,c&p web gui不是最好的解决方案,我认为……你说的“字符不被捕获”是什么意思?如果有人输入01/01/a1,则不会抛出警报,页面将提交。关于C&P,我非常同意,但我离题了。确定,然后删除行If(!obj.value.match(P))return;
在没有警报的情况下停止,并在num==null的情况下添加警报
@VladMinaev-如何修改此脚本以生成所需的输出。*a/a/a错误警报用户-检查*1/2/10更新输入字段以读取01/03/2010*01/01/12更新输入字段以读取01/01/2012*1/10/2更新input字段改为01/10/2002`一个新脚本可以使用,只要它与此脚本一起使用。