【问题标题】:validate datetime with javascript and regex使用 javascript 和正则表达式验证日期时间
【发布时间】:2014-01-07 13:21:02
【问题描述】:

我正在尝试使用有效的日期时间格式验证文本框。我需要检查 24 小时日期时间格式。所以我在我的文本框中输入以下文本22.05.2013 11:23:22

但它仍然无法正确验证它。我对正则表达式完全陌生。到目前为止,我已经尝试过

$('#test1').blur(function(){
 var validTime = $(this).val().match(/^[0,1]?\d\/(([0-2]?\d)|([3][01]))\/((199\d)|([2-9]\d{3}))\s[0-2]?[0-9]:[0-5][0-9]?$/);
    debugger;
    if (!validTime) {
        $(this).val('').focus().css('background', '#fdd');
    } else {
        $(this).css('background', 'transparent');
    }
});

这是我的fiddle

【问题讨论】:

  • 你从哪里得到的模式表格?为什么会有[0,1]?这不允许22.05.2013
  • 您的正则表达式使用斜线而不是点作为日期
  • debugger; 有什么作用?
  • @Jonathan debugger 只是为了调试代码

标签: javascript regex validation


【解决方案1】:

试试这样的:

function checkDateTime(element){
  if (!Date.parse(element.value)){ 
     element.style.background = 'red'; 
     element.focus(); 
     return false; 
  } else { 
     element.style.background = 'white'; 
    return true; 
  }
}

function checkForm(form){
  return checkDateTime(form.mytxtfield01) && checkDateTime(form.mytxtfield02)
}

没有正则表达式;仅使用函数 Date.parse('...')。

【讨论】:

    【解决方案2】:

    使用正则表达式验证日期非常困难。例如,您如何验证 2 月 29 日? (很难!)

    相反,我会使用内置的 Date 对象。它总是会产生一个有效的日期。如果你这样做:

    var date = new Date(2010, 1, 30); // 30 feb (doesn't exist!)
    // Mar 02 2010
    

    所以你会知道它是无效的。您会看到它溢出到 March,这适用于所有参数。如果您的秒数是>59,它将溢出到分钟等。

    完整解决方案:

    var value = "22.05.2013 11:23:22";
    // capture all the parts
    var matches = value.match(/^(\d{2})\.(\d{2})\.(\d{4}) (\d{2}):(\d{2}):(\d{2})$/);
    //alt:
    // value.match(/^(\d{2}).(\d{2}).(\d{4}).(\d{2}).(\d{2}).(\d{2})$/);
    // also matches 22/05/2013 11:23:22 and 22a0592013,11@23a22
    if (matches === null) {
        // invalid
    } else{
        // now lets check the date sanity
        var year = parseInt(matches[3], 10);
        var month = parseInt(matches[2], 10) - 1; // months are 0-11
        var day = parseInt(matches[1], 10);
        var hour = parseInt(matches[4], 10);
        var minute = parseInt(matches[5], 10);
        var second = parseInt(matches[6], 10);
        var date = new Date(year, month, day, hour, minute, second);
        if (date.getFullYear() !== year
          || date.getMonth() != month
          || date.getDate() !== day
          || date.getHours() !== hour
          || date.getMinutes() !== minute
          || date.getSeconds() !== second
        ) {
           // invalid
        } else {
           // valid
        }
    
    }
    

    JSFiddle:http://jsfiddle.net/Evaqk/117/

    【讨论】:

    • 我们能否也检查一下这个日期时间格式 22/05/2013 11:23:22?以前我使用 22.05.2013 11:23:22。所以如果用户输入 / 或 .那么两者都是有效的
    • 当然。将正则表达式更改为 /^(\d{2}).(\d{2}).(\d{4}).(\d{2}).(\d{2}).(\d{2})$/ 以允许任何类型的单字符分隔符。 . = 任何字符,而 \. (escape+.) 仅匹配字符 .
    • 在我的特殊情况下,我必须通过使用 (.(\d{2}))? 而不是最后一个 .(\d{2}) 来使最后 3 个时间字符(秒)可选。我需要匹配时间,例如 11:23 和 11:23:55。感谢您抢先一步!
    【解决方案3】:

    您需要正确测试正则表达式以确保它与您想要的日期格式匹配。这个工具可以帮你调试表达式:http://regexpal.com/

    或者,由于您已经在使用 jQuery,您可以尝试使用验证插件,例如 http://formvalidator.net/

    【讨论】:

    • 日期并不真正遵循常规语法,特别是如果您考虑闰年。正则表达式不是验证日期的正确工具。现在是日期格式,当然,但不是实际日期。
    • 我完全同意,但如果您检查 OP 的问题:“我正在尝试使用'有效日期时间格式'验证文本框”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2013-05-03
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多