【问题标题】:Date input type validation in javascript?javascript中的日期输入类型验证?
【发布时间】:2016-06-30 05:46:21
【问题描述】:

我不太清楚如何在 javascript 中验证日期输入类型。我尝试在互联网上查找,但我找不到任何东西。

我有一个字段要求用户输入其生日。我想在 javascript 中验证它,并且对天数、尤其是数年有一定的限制。例如,如果用户输入超过 2016 年(或当前年份),则会出错。 我不太清楚如何“提取”日期输入类型并控制它的每个元素(日、月、年)。

这是我的html的一部分

<form method="POST" action="request.jsp" onsubmit="return validate()">
Date of birth: <input type="date" id="bday" name="bday" value="">
</form>

Javascript:

var birthday = document.getElementById('bday').value;

这就是我所拥有的一切......请帮忙?

【问题讨论】:

    标签: javascript html forms validation


    【解决方案1】:

    TLDR

    您必须将字符串解析为日期(JavaScript 为这个用例提供了 Date API)。

    完整答案

    你在正确的轨道上。这是我做的JSBin 示例。尝试打开控制台并更改日期,您会看到它已记录。

    $('#birthday').on('change', function() {
       console.log(new Date(this.value));
    });
    

    (我在上面的例子中使用 jQuery 只是为了方便,但你可以使用任何你想要的。)

    您遇到的问题是日期被记录为字符串。您可以使用 JavaScript Date 对象来解析字符串。

    根据您想要执行的任何验证,您可以使用各种日期对象方法(例如getFullYear)并将这些方法与输入进行匹配。

    我将把完整的实现留给你,但change 处理程序的内部可能如下所示:

    var date = new Date(this.value);
    
    if(date.getFullYear() > 2016) {
      // do something (like show a message, for example)
    }
    

    【讨论】:

    • 感谢您的回答,我注意到您使用了 jQuery,但我是初学者,我还没有研究过..
    • @shean 你不需要使用 jQuery。在示例中,我只是选择了一个 DOM 节点(在本例中,以 birthday 作为 ID 的元素)并观察其 onchange 事件。你熟悉 JavaScript 事件吗?
    • 他在&lt;form&gt;中有一个onsubmit attr
    • @JoshBeam 是的,但我不熟悉 jQuery 语法,无论如何我理解你的代码和你想说的(排序)
    • 不,不要那样做。输入类型日期将返回类似“2016-03-20”的字符串。 Date 构造函数(和 Date.parse)会将其解析为 UTC,因此对于格林威治以西的用户,生成的本地日期将为“2016-03-19”。 总是手动解析日期字符串,库可以提供帮助,但很少需要。
    【解决方案2】:

    如果您能够通过以下方式获取输入元素的值:

     var birthday = document.getElementById('bday').value;
    

    然后birthday 将作为字符串 提供给您(所有输入值始终作为字符串返回给JavaScript)。从那里,您需要将该字符串转换为日期:

     var dob = Date.parse(birthday);
    

    然后,一旦您获得了整个日期,您就可以使用各种 JavaScript 日期/时间方法提取其中的各个部分:

     var month = dob.getMonth(); // months start counting from zero!
     var day   = dob.getDate();
     var year  = dob.getFullYear();  // getYear() provides 3 digit year!
    

    这是一个工作示例:

    var birthday = null, btn = null, output = null;
    
    // Wait until the document is ready for interaction:
    window.addEventListener("DOMContentLoaded", function(){
    
         // Get references to DOM elements needed:
         birthday = document.getElementById('bDate');
         btn = document.getElementById('btnGetDate');
         output = document.getElementById('result');
    
    
         // Set up an event callback for when the button gets clicked:      
         btn.addEventListener("click", function(){
           
    
            // Create a new Date that converts the input date
            var dob =new Date(birthday.value);
            alert(dob);
    
            // Extract pieces of the date:
            var month = dob.getMonth(); // months start counting from zero!
            var day   = dob.getDate();  
            var year  = dob.getFullYear();
    
            // Now that you have the pieces of the date, you can validate as you wish:
            // e.g. if(year > 2016) { . . . }
      
            // Write out date:
            output.innerHTML = ++month + "/" + ++day + "/" + year; 
    
         });
      
    });
    
    
    
    
    
      
    <input type="date" id="bDate">
    <input type="button" id="btnGetDate" value="Get Date">
    <p id="result"></p>

    注意:请记住,夏令时会影响 结果取决于它是一天中的什么时间。看: How to check if the DST (Daylight Saving Time) is in effect and if it is what's the offset? 了解更多信息。关于那个。

    【讨论】:

    • 夏令时如何影响日期字符串的解析?世界上哪些地方更改进入或退出夏令时会影响日期?当我选择 3 月 7 日时,为什么您的代码显示 3 月 8 日(提示:您可能在格林威治西部,所以使用了++day,我在东部)。
    • 你是对的。我的意思是(但没有很好地表达)是 UTC 偏移量受 DST 影响。我通常是 -5:00 GMT,但截至昨天,当我还在那个区域时,它实际上是 -4:00。
    • 我在表单上有一个提交按钮,那个获取按钮是干什么用的?
    • 我的示例只是展示了如何使用日期字段,我需要一个按钮来激活该功能。你会使用你的按钮。
    【解决方案3】:

    并非所有浏览器都支持输入类型日期,因此您应该检测到这一点并将输入替换为包含所需格式的合适替代项。

    在支持的情况下,输入将返回不带时区的 ISO 8601 格式日期字符串。根据 ISO 8601,这应该被视为本地,但 TC39 在他们的智慧中决定它应该被视为 UTC,所以这就是 Date.parse(和 Date 构造函数)将在 most 中执行的操作案例。在某些情况下,它将被视为本地,而在 IE 8 中则被视为无效。因此,对于时区在格林威治以西的系统,Date.parse('2016-03-20') 将返回一个 Date 对象,当显示为本地日期时,它将是“2016-03-19”,即提前一天。

    因此,您应该手动解析日期字符串,使用here 的众多答案之一验证日期,然后检查年、月和日是否在您的限制范围内。

    【讨论】:

    • 不需要检测和替换日期输入类型,因为它在不支持它的浏览器上会退回到默认文本类型。另外,您的链接无效。
    • @yourmom——链接已修复。您认为用户将如何表现给定日期输入字段,而对预期格式的帮助为零?简单地用文本输入替换它是不够的,因此“…合适的替代包括所需的格式”。
    • 这正是问题的重点。如果用户的浏览器支持日期选择器,它已经是一个有效的日期。没有必要告诉某人标记他们的输入,不是那种给定的..
    • @yourmom——不,不是。该问题仅询问输入类型日期。我试图指出大量用户的浏览器不支持它,因此必须提供合适的东西。除非 OP 乐于让这些用户猜测所需的格式,否则纯文本字段是不够的。执行 OP 要求的操作甚至不需要将值解析为 Date。
    • op 表示有兴趣操纵日期,即月、年。这绝对需要 Date 对象。日期对象接受不明确的格式。没有理由告诉用户以特定方式表达。
    【解决方案4】:

    如果你只是想验证一个字符串是否是一个有效的日期,你可以检查它是否创建了一个有效的日期对象。

    function isValidDate(d){
        return !isNaN((new Date(d)).getTime());
    }
    

    https://jsfiddle.net/46cztok6/


    所以你的validate() 函数看起来像这样。

    function validate(){
        var birthday = document.getElementById('bday').value;
        if(!isValidDate(birthday)){
            alert("you did not enter a valid birthday");
            return false;
        } 
    }
    

    【讨论】:

    • 我想验证日期是否有效
    • 这正是它的作用。
    • isValidDate 函数可以简单地为return !isNaN(new Date(d));。但是,您还依赖 Date 构造函数来正确解析字符串,这是出了名的糟糕(即使完全符合 ECMAScript 2015)。
    • 当然,但是手动解析日期字符串(或任何东西,真的)以获取不明确的格式是乏味的,而且很难完美地做到这一点。这种方式适用于 95% 以上的实际应用程序。
    • 3 行代码到parse and validate a date string 以一种适用于每个支持 javascript 的用户代理的方式几乎不乏味。在超过 5% 的情况下,上述方法会失败。
    【解决方案5】:

    这是一个 bin,因此您可以了解如何开始验证此类字段:https://jsbin.com/lifacaxonu/edit?html,js,console,output

    $('#birthday').on('change', function() {
      var val = this.value.split('-');
      if (val[0] > new Date().getFullYear()) {
        console.log('invalid')
      } else {
        console.log('ok')
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      相关资源
      最近更新 更多