确保日期有效的Javascript方法

时间:2011-08-05 00:44:08

标签: javascript html function testing validation

我正在尝试编写一个检查日期是否有效的方法。它按顺序传递三个字符串:月,日和年。月份应该是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也发生了同样的事情。我不知道我哪里出错了。

5 个答案:

答案 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];
}

它可能更快或不快。 : - )