Регулярное выражение для проверки метки времени
Мне нужно регулярное выражение для проверки метки времени формата, используя 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
на каждой позиции. Что следует отметить:
- Вы можете указать только дату, только время, или обе даты + время
- время может быть в 12-часовом или 24-часовом формате
- секунды необязательны
утра / вечера не является обязательным
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);
}
Проверьте, пожалуйста
С помощью
(\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d
может проверить синтаксис, но, как указывает Бальфа, это не делает его действительной датой.