代码之家  ›  专栏  ›  技术社区  ›  M.N

用于验证时间戳的正则表达式

  •  5
  • M.N  · 技术社区  · 15 年前

    我需要一个正则表达式来验证格式的时间戳, 使用javascript :

    年/月/日hh:mi:ss

    我试着做了一些,但似乎我的正则表达式技能没有涵盖什么。

    请给我一个推荐信或做这件事的方法。

    附言:我提到regex,只是作为一个建议。我使用的是javascript,欢迎任何选择。

    11 回复  |  直到 7 年前
        1
  •  16
  •   Joey Gumbo    15 年前

    我建议你用 Datejs 为此。不需要自己分析日期,而且regex不足以验证时间戳。使用datejs,您可以解析日期中的字符串,如果该字符串无效,则会得到空值:

    Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss");
    
        2
  •  6
  •   Joey Gumbo    15 年前

    您应该考虑不使用正则表达式,而是使用正确的格式字符串在datetime中运行字符串。这样您就可以确保它确实是一个有效的时间戳,而不仅仅是看起来像它的东西。

        3
  •  6
  •   soulmerge    15 年前

    如果您只想验证语法,这里是posix regex:

    [0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}
    

    但是,如果您想检查语义,我将使用您选择的语言处理字符串,您不能用正则表达式(如闰年/秒、夏时制等)处理太多的情况。

        4
  •  4
  •   Okipa    7 年前

    我刚刚编写了一个regex来控制mysql日期时间(我认为对于Oracle或其他数据库服务器来说,这并没有什么不同)。

    此regex非常安全,并控制日期的有效性(28天、30天和31天,甚至29/02年)。然后,它控制时间。 时间戳格式如下:

    年-月-日hh:mm:ss

    这是regex(相当长):

    ((((19|20)([2468][048]|[13579][26]|0[48])|2000)-02-29|((19|20)[0-9]{2}-(0[4678]|1[02])-(0[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}-(0[1359]|11)-(0[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}-02-(0[1-9]|1[0-9]|2[0-8])))\s([01][0-9]|2[0-3]):([012345][0-9]):([012345][0-9]))
    

    比赛

    2013-04-05 17:59:59 2013-07-30 01:22:42 2099-12-30 23:59:59 2016-02-28 00:00:00:00

    非匹配

    2016-02-29-01:01:02 3000-04-24 17:42:21 2012-03-03 24:24:02 2012-03-03 21:60:45

    我想我做不到更安全的。功能非常好,经过测试。 如果您使用它,请随时给我反馈;)

    仅供参考:如果您只是在没有时间的情况下查找日期regex控件,请到那里查找: Regular Expression to match valid dates (查看我的帖子)。

    干杯

        5
  •  3
  •   Stéphane    14 年前

    下面是我今天早些时候写的一个regex,用于验证字符串的格式与您提到的格式类似: YYYY-MM-DD hh:mm:ss . 它不确定一些坏日期(例如2月30日),但可能比使用简单的 \d 在每个位置。需要注意的事项:

    1. 您可以只指定一个日期、一个时间或同时指定日期+时间
    2. 时间可以是12小时或24小时格式
    3. 秒是可选的
    4. AM/PM是可选的

      const std::string dateAndTimeRegex =
          "^\\s*"                     // ignore whitespace
          "("                         // start of date
              "201[0-9]"              // year: 2010, 2011, ..., through 2019
              "\\W"                   // delimiter between year and month; typically will be "-"
              "([0]?[0-9]|1[012])"    // month: 0 through 9, or 00 through 09, or 10 through 12
              "\\W"                   // delimiter between month and day; typically will be "-"
              "([012]?[0-9]|3[01])"   // day: 0 through 9, or 00 through 29, or 30, or 31
          ")?"                        // end of optional date
          "\\s?"                      // optional whitespace
          "("                         // start of time
              "([01]?[0-9]|2[0-3])"   // hour: 0 through 9, or 00 through 19, or 20 through 23
              "\\W"                   // delimiter between hours and minutes; typically will be ":"
              "([0-5][0-9])"          // minute: 00 through 59
              "("                     // start of seconds (optional)
                  "\\W"               // delimiter between minutes and seconds; typically will be ":"
                  "([0-5][0-9])"      // seconds: 00 through 59
              ")?"                    // end of optional seconds
              "(\\s*[AaPp][Mm])?"     // optional AM, am, PM, pm
          ")?"                        // end of optional time
          "\\s*$";                    // trailing whitespace
      
        6
  •  1
  •   James    15 年前
    function validateTimestamp(timestamp) {
    
        if (!/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/.test(timestamp)) {
            return false;
        }
    
        var split = timestamp.split(/[^\d]+/);
    
        var year = parseFloat(split[0]);
        var month = parseFloat(split[1]);
        var day = parseFloat(split[2]);
    
        var hour = parseFloat(split[3]);
        var minute = parseFloat(split[4]);
        var second = parseFloat(split[5]);
    
        return hour < 25 && minute < 61 && second < 61 && month < 13 && day < 32;
    
    }
    
        7
  •  1
  •   riroo    10 年前

    对于1000年和2999年之间的有效日期,请使用:

    String pattern = "((1\\d{3})|(20\\d{2}))-((0\\d)|(1[0-2]))-(([1-2]\\d)|(3[0-1])) (([0-1]\\d)|(2[0-3])):([0-5]\\d):([0-5]\\d)";
    

    月份可以在01到12之间,01到31之间,00:00到23:59:59之间。

        8
  •  0
  •   Nikolai Ruhe    15 年前

    Perl样式:[12]\d 3/[01]\d/[0-3]\d[0-2]\d(?:([05-5] d){ 2 }

        9
  •  0
  •   RuudKok    15 年前

    Regular-Expressions.info 是一个很好的信息来源,它也有一个很好的 tutorial .

        10
  •  0
  •   OtherDevOpsGene    15 年前

    使用

    (\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d
    

        11
  •  0
  •   ibrahim    7 年前
    function isTimestamp($input){
                var $regex = /^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/;
                return $regex.test($input);
            }
    

    支票,请