我正在尝试编写一个检查日期是否有效的方法。它按顺序传递三个字符串:月,日和年。月份应该是0-11而不是1-12。我已经在Java中测试了代码的逻辑并且它可以工作。 is_int是另一种测试String是否仅由数字字符组成的方法。不幸的是,我遇到了一些我无法弄清楚的问题。
function is_int(value) {
for (i = 0 ; i < value.length ; i++) {
if ((value.charAt(i) < '0') || (value.charAt(i) > '9')) return false
}
return true;
}
function isValidDate(value1:String, value2:String, value3:String)
{
if (!is_int(value3)) return false;
if (!is_int(value2)) return false;
if (!is_int(value1)) return false;
var v1 = parseInt(value1) + 1;
var v2 = parseInt(value2);
var v3 = parseInt(value3);
if (v1 > 12 || v1 < 1) return false;
if (v2 > 31 || v2 < 1) return false;
if (v2 == 31) if (v1 == 2 || v1 == 4 || v1 == 6 || v1 == 9 || v1 == 11) return false;
if (v1 != 2) return true;
if (v2 < 29) return true;
if (v2 == 30) return false;
if (v3 % 400 == 0)
return true;
else if (v3 % 100 == 0)
return false;
else if (v3 % 4 == 0)
return true;
else
return false;
}
我的第一个测试人员需要三个文本输入,如果isValidDate函数返回false,则显示一个警告。如果没有,它会转发到空白的html页面。但是,我试过这个:
function validate() {
if (!isValidDate("a", "a", "a")) {
alert("wrong");
return false;
}
}
并且警报从未显示,并且每次都会转发。奇怪的是,当我删除isValidDate前面的感叹号时,仍然会发生这种情况。我也尝试将双引号换成单引号,但这也没有解决问题。我的测试人员对is_int也发生了同样的事情。我不知道我哪里出错了。
答案 0 :(得分:2)
我知道你没有要求它,但这是一个多更有效的方法来检查日期,它更一致地处理奇数日期:
function isValidDate(year, month, day) {
var d = new Date(parseInt(year,10), parseInt(month, 10)-1, parseInt(day, 10), 0, 0, 0);
return d.getFullYear() == year &&
(d.getMonth()+1) == month &&
d.getDate() == day;
}
isValidDate("2011", "08", "04"); // true
isValidDate("bob", "08", "04"); // false
isValidDate("1979", "1", "1"); // true
摆弄它:http://jsfiddle.net/2WJCv/
替代纯HTML链接:http://pastehtml.com/view/b2se2lk9k.html
答案 1 :(得分:0)
我认为你的问题出现在isValidDate()函数中:应该是function isValidDate(value1, value2, value3)
我得到了一个警告。希望有所帮助! :)
答案 2 :(得分:0)
如果你拿出非法的javascript,它似乎适合我在这个jsFiddle:http://jsfiddle.net/jfriend00/ae9aC/。
在你的代码中,我改变了这个:
function isValidDate(value1:String, value2:String, value3:String)
到此:
function isValidDate(value1, value2, value3)
并且,jsFiddle在传递isValidDate("a", "a", "a")
时会发出警告。
仅供参考,这个功能有很多方法可以改进。首先,我建议你将value1,value2和value3更改为月,日,年和类似的v1,v2和v3,这样该函数就可以更自我描述了。
此外,parseInt()
应始终传递基数parseInt(str, 10)
,否则它将根据字符串的内容“猜测”基数。
答案 3 :(得分:0)
您的功能声明无效:
function isValidDate(value1:String, value2:String, value3:String) {
// your code here
}
JavaScript函数参数和变量声明没有类型,因此您需要说:
function isValidDate(value1, value2, value3) {
// your code here
}
(一个不相关的建议:更有意义地命名你的参数和变量。如果你期望月,日,年,为什么不打电话给他们呢?特别是在处理许多国家通常说日,月,年的日期而不是月,日,年。
另一个不相关的建议:查看正则表达式。)
答案 4 :(得分:0)
如果您喜欢长时间而不使用Date构造函数,请尝试:
function validDate(y, m, d) {
// Days in month
var days = [,31,28,31,30,31,30,31,31,30,31,30,31];
// Adjust February it's a leap year
if (m == 2 && (!(y%4) && y%100) || !(y%400)) {
days[2] = 29;
}
// Check date in month
return d <= days[+m];
}
它可能更快或不快。 : - )