【问题标题】:How can I check if user passes a valid date in javascript?如何检查用户是否在 javascript 中传递了有效日期?
【发布时间】:2010-11-07 15:09:28
【问题描述】:

我有一个检查日期范围的 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");
            }
}

【问题讨论】:

    标签: .net asp.net javascript html


    【解决方案1】:

    看看这个库 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 - 正确 - 唯一的解决方案是测试天数或月份是否大于 12 - 如果不是,您必须返回日期不明确,他们应该使用 dd/mm/年年
    【解决方案2】:

    以任意格式解析日期是一个非常棘手的问题(正如@Natrium 指出的那样)。当您考虑到欧洲将日期写为 dd/mm/yyyy 时,这就更加令人困惑了,因此您无法判断 2/7/09 是 2 月 7 日还是 7 月 2 日。

    大多数人通过使用 javascript 库中的 datepicker 类型的控件或使用带有月、日和年设置值的下拉框来解决这个问题。

    <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”,而在大多数平台上,下拉菜单将打开一个狭窄的高矩形,这很难管理。另一方面,拥有非基于选择的控件仍然会使您遇到解析问题。
    • 实际上,如果您选择选项卡然后输入“2”然后输入“7”,它将正确选择“27”。 (使用 Firefox 测试)。
    【解决方案3】:

    无论格式如何?

    这会很棘手......

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

    全部有效,但格式不同。所以,不管格式如何……我严重怀疑……

    【讨论】:

      【解决方案4】:

      您可以使用正则表达式或自定义代码。示例如下:

      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;
      }
      

      【讨论】:

        【解决方案5】:

        我意识到我必须对背后的代码进行验证。这些都是很好的答案,但开始变得复杂了。我不想让自己在角落里退缩,所以我选择了备用路线。谢谢

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-22
          • 2012-05-22
          • 2012-04-16
          • 1970-01-01
          • 2015-01-29
          • 2017-02-28
          • 1970-01-01
          相关资源
          最近更新 更多