Это:
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()
, то вы можете сделать гораздо более мощные вещи.
Я бы порекомендовал использовать Datejs для этого. Самостоятельный синтаксический анализ даты не является необходимым, и регулярного выражения недостаточно для проверки метки времени. С помощью datejs вы можете проанализировать строку в дате, и вы получите null, если она недействительна:
Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss");
Использование
(\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d
может проверить синтаксис, но, как указывает балфа, это не делает дату действительной.
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;
}
Regular-Expressions.info - хороший источник информации о RegEx, а также хороший учебник .
стиль perl: [12] \ d {3} / [01] \ d / [0-3] \ d [0-2] \ d (? :: [0-5 ] \ d) {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}
Но если вы хотите проверить семантику, я бы обработал строку, используя выбранный вами язык, есть слишком много случаев, которые нельзя охватить с помощью регулярных выражений (например, високосные годы / секунды, летнее время и т. д.)
Вам следует подумать о том, чтобы не делать этого с регулярными выражениями, а просто пропустить строку через DateTime с правильной строкой формата. Таким образом, вы можете убедиться, что это действительно действительная временная метка, а не что-то похожее на нее.
Вот регулярное выражение, которое я написал сегодня для проверки строк в формате, аналогичном тому, который вы упомянули: ГГГГ-ММ-ДД чч: мм: сс
. Он не определяет некоторые плохие даты (например, 30 февраля), но может быть немного лучше, чем использование упрощенного \ d
в каждой позиции. На заметку:
am / pm является необязательным
const std :: string dateAndTimeRegex =
"^ \\ s *" // игнорировать пробелы
"(" // начало даты
"20
[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 лет, если это необходимо.