如何在JavaScript中检查用户是否输入了有效的日期?

5

我有一个检查日期范围的JavaScript函数。有没有办法在不考虑日期格式的情况下检查用户是否在文本框中输入了有效日期?

function checkEnteredDate() {
            var inputDate = document.getElementById('txtDate');
            //if statement to check for valid date
            var formatDate = new Date(inputDate.value);
            if (formatDate > TodayDate) {
                alert("You cannot select a date later than today.");
                inputDate.value = TodayDate.format("MM/dd/yyyy");
            }
}
5个回答

9
请看这个库date.js:http://code.google.com/p/jqueryjs/source/browse/trunk/plugins/methods/date.js 它有一个有用的函数叫做fromString,可以尝试将基于Date.format的字符串转换为有效的日期对象。
如果函数不能创建有效的日期对象,则返回false - 然后你可以尝试不同的格式,直到所有都返回false之前放弃。
以下是一些示例格式供测试:
Date.format = 'dd mmm yyyy';
alert(Date.fromString("26 Jun 2009"));

Date.format = 'mmm dd yyyy';
alert(Date.fromString("Jun 26 2009"));

Date.format = 'dd/mm/yy';
alert(Date.fromString("26/06/09"));

Date.format = 'mm/dd/yy';
alert(Date.fromString("06/26/09"));

Date.format = 'yyyy-mm-dd';
alert(Date.fromString("2009-06-26"));

乔什


除非用户指定格式,否则您仍将面临欧洲/美国的歧义问题。 - Matt Bridges
@Matt - 正确 - 这个问题的唯一解决方案是测试天数或月份是否大于12 - 如果不是,您必须返回日期不明确,并建议使用dd/mm/yyyy。 - Josh

4
这是一个非常棘手的问题,需要解析任意格式的日期(正如@Natrium所指出的)。当你考虑到欧洲人将日期写成dd/mm/yyyy时,情况就更加混乱了,因此你无法确定2/7/09是2月7日还是7月2日。
大多数人通过使用JavaScript库中的日期选择器类型控件或使用下拉框来解决此问题,其中包含月份、日期和年份的设定值。
<select name="month">
<option value="1">January</option>
<option value="2">February</option>
...
<option value="12">December</option>
</select>

<select name="day">
<option value="1">1</option>
<option value="2">2</option>
...
<option value="31">31</option>
</select>

<select name="year">
<option value="2000">2000</option>
<option value="2001">2001</option>
...
<option value="2009">2009</option>
</select>

使用选择器是一个糟糕的解决方案。现在,我需要滚动整个数字列表来输入“27”这一天数 - 在大多数平台上,下拉菜单会打开成一个窄高的矩形,难以管理。另一方面,使用非选择器控件仍然会让你遭受解析问题的困扰。 - levik
1
实际上,如果您在选取字段上按Tab键,然后输入“2”,然后输入“7”,它将正确选择“27”。(使用Firefox进行测试)。 - Matt Bridges

3

无论格式如何?

那将会很棘手...

  • 2009/07/02 是一个有效的日期
  • 02/07/09 也是
  • 2-7-09 也是
  • 02-7-'09 也是
  • 2009年7月2日 --> 同样有效
  • twee juli tweeduizend en negen --> 同样有效(荷兰语)

所有都是有效的,但是格式不同。所以,无论格式如何... 我严重怀疑...


2
你可以使用正则表达式或自定义代码。以下是示例:
function isValidDate(dateStr, format) {
   if (format == null) { format = "MDY"; }
   format = format.toUpperCase();
   if (format.length != 3) { format = "MDY"; }
   if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || _
      (format.indexOf("Y") == -1) ) { format = "MDY"; }
   if (format.substring(0, 1) == "Y") { // If the year is first
      var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
      var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
   } else if (format.substring(1, 2) == "Y") { // If the year is second
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
   } else { // The year must be third
      var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
   }
   // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
   if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
   var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
   // Check to see if the 3 parts end up making a valid date
   if (format.substring(0, 1) == "M") { var mm = parts[0]; } else _
      if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; }
   if (format.substring(0, 1) == "D") { var dd = parts[0]; } else _
      if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; }
   if (format.substring(0, 1) == "Y") { var yy = parts[0]; } else _
      if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; }
   if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
   if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
   if (parseFloat(dd) != dt.getDate()) { return false; }
   if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
   return true;
}

0

我意识到必须对代码进行验证。这些都是很好的答案,但开始变得复杂。我不想陷入困境,所以选择了另一条路。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接