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

Это:

var foo = new Foo();

и

var foo = Object.create(Foo.prototype);

очень похожи. Одно важное отличие состоит в том, что new Foo фактически выполняет код конструктора, тогда как Object.create не будет выполнять код, такой как

function Foo() {
    alert("This constructor does not run with Object.create");
}

. Обратите внимание, что если вы используете двухпараметрическую версию Object.create(), то вы можете сделать гораздо более мощные вещи.

6
задан Nietzche-jou 29 June 2009 в 11:15
поделиться

8 ответов

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

Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss");
17
ответ дан 8 December 2019 в 02:08
поделиться

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

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

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

1
ответ дан 8 December 2019 в 02:08
поделиться
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;

}
2
ответ дан 8 December 2019 в 02:08
поделиться

Regular-Expressions.info - хороший источник информации о RegEx, а также хороший учебник .

1
ответ дан 8 December 2019 в 02:08
поделиться

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

1
ответ дан 8 December 2019 в 02:08
поделиться

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

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

6
ответ дан 8 December 2019 в 02:08
поделиться

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

6
ответ дан 8 December 2019 в 02:08
поделиться

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

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

     const std :: string dateAndTimeRegex = 
     "^ \\ s *" // игнорировать пробелы 
     "(" // начало даты 
     "20 
  5. [0-9] "// год: 2010, 2011, ..., до 2039 " \\ W "// разделитель между годом и месяцем; обычно будет" - " "([0]? [0-9] | 1 [012])" // месяц: с 0 по 9, или с 00 по 09, или с 10 по 12 "\\ W" // разделитель между месяцами и день; обычно будет "-" "([012]? [0-9] | 3 [01])" // день: с 0 по 9, или с 00 по 29, или 30, или 31 ")?" // конец необязательной даты "\\ s?" // необязательный пробел "(" // начало времени "([01]? [0-9] | 2 [0-3])" // час: от 0 до 9, или с 00 по 19, или с 20 по 23 "\\ W" // разделитель между часами и минутами; обычно будет ":" "([0-5] [0-9] ) "// минута: от 00 до 59 " ("// начало секунд (необязательно) " \\ W "// разделитель между минутами и секундами; обычно будет": "{ {1}} "([0-5] [0-9])" // секунды: с 00 по 59 ")?" // конец необязательных секунд »(\\ s * [AaPp] [Mm])? "// необязательно AM, AM, PM, PM ")? " // конец необязательного времени "\\ s * $"; // завершающий пробел


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

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

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

4
ответ дан 8 December 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: