正则表达式以验证时间戳

时间:2009-06-29 10:58:40

标签: javascript regex validation timestamp

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

  

YYYY / MM / DD HH:MI:SS

我尝试烹饪一些,但似乎我的正则表达式技能无法覆盖某些东西。

请给我一个参考或方法来做。

P.S。 :我提到正则表达式,仅作为建议。我使用Javascript并欢迎任何替代方案。

13 个答案:

答案 0 :(得分:16)

我建议您使用Datejs。不需要自己解析日期,并且正则表达式不足以验证时间戳。使用datejs,您可以在日期中解析字符串,如果无效,您将获得null:

Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss");

答案 1 :(得分:6)

如果您只想验证语法,这里是POSIX正则表达式:

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

但是如果你想检查语义,我会用您选择的语言处理字符串,有太多的情况你无法用正则表达式覆盖(如闰年/秒,夏令时等)

答案 2 :(得分:6)

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

答案 3 :(得分:4)

这是我今天早些时候写的一个正则表达式,用于验证类似于你提到的格式的字符串:YYYY-MM-DD hh:mm:ss。它不会识别一些不良日期(例如,2月30日),但可能比在每个位置使用简单\d略好一些。注意事项:

  1. 您只能指定日期,时间或日期+时间
  2. 时间可以是12小时或24小时格式
  3. 秒是可选的
  4. 上午/下午是可选的

    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
    

答案 4 :(得分:4)

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

此ReGex非常安全,可以控制日期的有效期(28,30和31天,甚至29/02年)。然后,它控制时间。 时间戳格式是这一个:

  

YYYY-MM-DD HH:MM:SS

这是正则表达式(很长):

((((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

非匹配

  

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

我认为我不能做一个更安全的人。非常功能和测试。 如果你使用它,请不要犹豫,给我反馈;)

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

干杯

答案 5 :(得分:2)

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;

}

答案 6 :(得分:2)

对于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:00到23:59:59之间的时间。

答案 7 :(得分:1)

perl风格:[12] \ d {3} / [01] \ d / [0-3] \ d [0-2] \ d(?:: [0-5] \ d){2}

答案 8 :(得分:1)

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

答案 9 :(得分:1)

使用

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

可以验证语法,但正如balpha指出的那样,这并不能使它成为有效的日期。

答案 10 :(得分:1)

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

请检查

答案 11 :(得分:1)

这是我如何建立与范围内的SQL时间戳yyyy-mm-dd hh:mm:ss完全匹配的正则表达式 [1970-01-01 00:00:002037-12-31 23:59:59]

$leapYear = "(19[79][26]|198[048]|20[02][048]|20[13][26])";
$leapDate = "$leapYear-02-29";

$regularYear = "(19[789][0-9]|20[012][0-9]|203[0-7])";
$regularFebruaryDate = "02-([01][1-9]|2[0-8])";
$month31Date = "(0[13578]|10|12)-([012][1-9]|3[01])";
$month30Date = "(0[469]|11)-([012][1-9]|30)";
$regularDate = "$regularYear-($regularFebruaryDate|$month30Date|$month31Date)";

$hours = "(2[0-3]|[01][0-9])";
$minutes = "[0-5][0-9]";
$seconds = "[0-5][0-9]";

$sqlTimestamp = "($leapDate|$regularDate) $hours:$minutes:$seconds";

注意:我避免在2038年减少边缘情况。最大时间戳为2038-01-19 03:14:07

答案 12 :(得分:0)

这是您要查找的正则表达式:

Column = CALCULATE(DIVIDE([No of Occurence];[Num_of_all_loans]))