Регулярное выражение для проверки метки времени

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

ГГГГ / ММ / ДД ЧЧ: МИ: СС

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

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

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

11 ответов

Решение

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

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

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

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

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

Вот регулярное выражение, которое я написал сегодня для проверки строк в формате, аналогичном тому, что вы упомянули: YYYY-MM-DD hh:mm:ss, Это не идентифицирует некоторые плохие даты (например, 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
    

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

ура

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;

}

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

Вот как я создаю регулярное выражение, точно совпадающее с отметкой времени 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

http://www.regular-expressions.info/ - хороший источник информации о RegEx, у него также есть хороший учебник.

Это регулярное выражение, которое вы ищете:

[0-9]{4}/(0[1-9]|1[0-2])/(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]
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);
        }

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

Стиль perl: [12]\d{3}/[01]\d/[0-3]\d [0-2]\d(?::[0-5]\d){2}

С помощью

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

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

Другие вопросы по тегам