Регулярное выражение для проверки метки времени - PullRequest
6 голосов
/ 29 июня 2009

Мне нужно регулярное выражение для проверки метки времени в формате, с использованием Javascript :

ГГГГ / ММ / ДД ЧЧ: MI: СС

Я пробовал готовить несколько блюд, но, похоже, мои навыки регулярных выражений не в состоянии охватить то или другое.

Пожалуйста, дайте мне ссылку или способ сделать это.

P.S. Я упоминаю регулярное выражение, только как предложение. Я использую Javascript и приветствую любую альтернативу.

Ответы [ 12 ]

16 голосов
/ 29 июня 2009

Я бы порекомендовал использовать для этого Datejs . Парсинг даты самостоятельно не является необходимым, и регулярных выражений недостаточно для проверки метки времени. С datejs вы можете проанализировать строку в дате, и вы получите null, если она недействительна:

Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss");
6 голосов
/ 29 июня 2009

Вам следует подумать не делать это с регулярными выражениями, а просто пропустить строку через DateTime с правильной строкой формата. Таким образом, вы можете убедиться, что это действительно действительная временная метка, а не просто нечто, похожее на это.

6 голосов
/ 29 июня 2009

Если вы просто хотите проверить синтаксис, вот регулярное выражение 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}

Но если вы хотите проверить семантику, я бы обработал строку, используя ваш язык по вашему выбору, слишком много случаев, которые вы не можете охватить с помощью регулярных выражений (таких как високосные годы / секунды, летнее время и т. Д.)

4 голосов
/ 12 апреля 2013

Я только что написал Regex для управления датой и временем MySQL (и я думаю, что для Oracle или другого сервера баз данных это не так уж и отличается).

Этот ReGex очень безопасен и контролирует срок действия даты (месяцы через 28, 30 и 31 день и даже годы с 29/02). Затем он контролирует время. Формат отметки времени следующий:

ГГГГ-ММ-ДД ЧЧ: ММ: СС

Вот регулярное выражение (довольно длинное):

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

Non-Похожее

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 без времени, перейдите туда, чтобы найти его: Регулярное выражение, чтобы соответствовать действительным датам (проверьте мой пост).

Приветствия

4 голосов
/ 27 марта 2010

Вот регулярное выражение, которое я написал сегодня для проверки строк в формате, подобном тому, что вы упомянули: YYYY-MM-DD hh:mm:ss. Он не определяет некоторые неверные даты (например, 30 февраля), но может быть немного лучше, чем использование упрощенного \d в каждой позиции. На что обратить внимание:

  1. вы можете указать только дату, просто время или и то и другое + 1006 *
  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
    
2 голосов
/ 08 июля 2014

Для действительной даты между 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.

2 голосов
/ 29 июня 2009
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;

}
1 голос
/ 28 марта 2019

Вот как я строю регулярное выражение, точно совпадающее с отметкой времени SQL yyyy-mm-dd hh:mm:ss в диапазоне [1970-01-01 00:00:00, 2037-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

1 голос
/ 22 декабря 2017
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);
        }

проверьте пожалуйста

1 голос
/ 29 июня 2009

Использование

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

может проверять синтаксис, но, как указывает Бальфа, это не делает его действительной датой.

...