Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

  1. Вы можете указать только дату, просто время или и то, и другое + дата
  2. время может быть в 12-часовом или 24-часовом формате
  3. секунды необязательны
  4. утра/вечера не является обязательным

    const std::string dateAndTimeRegex =
        "^\\s*"                     // ignore whitespace
        "("                         // start of date
            "20[123][0-9]"          // year: 2010, 2011, ..., through 2039
            "\\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
    

Комментарий @kyrias намекает на то, что это регулярное выражение потерпит неудачу через несколько месяцев после того, как мы достигнем 2020 года. В зависимости от того, как вы его используете, вам придется заменить "201 [0-9]" на что-то другое.

Например, если вы хотите проверить текущую дату + / - через несколько лет, вы можете изменить ее на "20 [12] [0-9]". Чтобы проверить 2000–2099, измените его на "20 [0-9] {2}".

Я изменил оригинальное регулярное выражение выше, чтобы искать 2010-2039. Кто-то еще может отредактировать этот ответ через 20 лет, если это необходимо.

Ответ 5

Я просто написал 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

не являющиеся Похожее

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

Я не думаю, что смогу сделать более защищенный. Очень функциональный и проверенный. Пожалуйста, если вы его используете, не стесняйтесь дать мне отзыв;)

FYI: Если вы просто ищете дату Регулятор Regex без времени, перейдите туда, чтобы найти его: Регулярное выражение для соответствия допустимым датам (проверьте мой пост).

Приветствия

Ответ 6

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

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

Ответ 8

Вот как я строю регулярное выражение, точно совпадающее с отметкой времени 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 года, чтобы иметь на один крайний случай меньше. Максимально возможная временная метка SQL - 2038-01-19 03:14:07.

Ответ 9

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

Ответ 11

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

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

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

Ответ 12

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

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