【问题标题】:Javascript method to ensure that a date is valid确保日期有效的 Javascript 方法
【发布时间】:2011-10-20 11:37:53
【问题描述】:

我正在尝试编写一个检查日期是否有效的方法。它按顺序以三个字符串传递:月、日和年。月份应为 0-11 而不是 1-12。我已经在 J​​ava 中测试了代码的逻辑并且它可以工作。 is_int 是另一种测试字符串是否仅由数字字符组成的方法。不幸的是,我遇到了我无法解决的问题。

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 测试仪也发生了同样的事情。我不知道我哪里出错了。

【问题讨论】:

  • 您可以使用内置函数isNaN 来检查字符串是否为有效数字。见stackoverflow.com/questions/175739/…
  • isNaN 与我的函数有点不同。例如,isNaN("") 返回 false,因为根据该函数,"" 等于 0。我不希望 "" 成为一个数字,所以我用我的代替。
  • parseInt(some_string, 10) == some_string 怎么样?

标签: javascript html function testing validation


【解决方案1】:

我知道你没有要求它,但这里有一个非常更有效的检查日期的方法,它可以更一致地处理奇数日期:

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

【讨论】:

  • jsfiddle 对我不起作用(我的连接中有奇怪的代理问题),所以我无法尝试您的示例(我懒得在本地尝试),但它是否处理非数字价值观?如果月份是“测试”,parseInt(month,10)-1 会做什么?
  • parseInt(val,10) 尝试将字符串转换为数字。如果该字符串无效,则返回NaN-1 是因为 Date 构造函数需要从 0 开始的月份。等一下,我给你另一个链接试试。 (编辑,哎呀,意思是 NaN。)
  • +1 因为这是一个很好的方法——尽管最后只需要测试 3 个条件中的 2 个。多余的没有伤害,只是多余的。也不需要设置小时、分钟和秒,但同样没有伤害。
  • @OverZealous - 是的,我知道 parseInt 可以返回 NaN,而且我知道从 0 开始的月份(我不明白 为什么 它们是基于0,但我知道)。我真正要问的是NaN - 1 的值是什么,当你将该值传递给Date 构造函数时会发生什么?感谢您使用其他链接的麻烦。
  • NaN +/- anything 仍然是 NaN 这是 JS 中一个奇怪的特殊构造。幸运的是,将 NaN 传递给 Date 构造函数只会返回一个“无效日期”,其中每个日期部分都是 NaN。同样幸运的是,NaN 不等于任何东西,所以测试仍然有效。
【解决方案2】:

我认为您的问题出在 isValidDate() 函数中:应该是 function isValidDate(value1, value2, value3) 我收到了警报。希望有帮助! :)

【讨论】:

  • 即丢失变量末尾的“:String”
  • 是的,我想这是我唯一的问题,尽管我认为这实际上是解决问题的方法。
【解决方案3】:

您的函数声明无效:

function isValidDate(value1:String, value2:String, value3:String) {
  // your code here
}

JavaScript函数参数和变量声明是没有类型的,所以你需要说:

function isValidDate(value1, value2, value3) {
  // your code here
}

(一个不相关的建议:更有意义地命名您的参数和变量。如果您期望月、日、年,为什么不这样称呼它们?尤其是在处理许多国家通常说日、月、年而不是月、日、年。

另一个不相关的建议:研究正则表达式。)

【讨论】:

  • 谢谢,这也是一个很好的答案。在粗略的谷歌搜索后,我在变量后面插入了 :String 以找出我的方法以前不起作用的原因。我必须在两者之间更改了其他内容,所以当我的方法主体最终正确时它仍然无法运行,但我不记得更改了其他任何内容,所以我真的很困惑。
【解决方案4】:

如果你把非法的 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) 否则它将根据字符串的内容“猜测”基数。

【讨论】:

  • 我认为类型注释还不是标准的。
  • 感谢您的帮助,尤其是 parseInt() 提示。
  • @joseph - 您可以对您认为有帮助的答案进行投票。这是 StackOverflow 背后的理念之一。
【解决方案5】:

如果您喜欢长期编写而不使用 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];
}

它可能会更快,也可能不会。 :-)

【讨论】:

  • 我只是不知道 Date 构造函数。不过感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多