Регулярное выражение для проверки временной метки
Мне нужно регулярное выражение для проверки временной метки формата с помощью Javascript:
ГГГГ/ММ/ДД ЧЧ: МИ: СС
Я попытался приготовить несколько, но, похоже, мои навыки регулярного выражения не могут что-то покрыть.
Пожалуйста, дайте мне ссылку или способ сделать это.
P.S.: Я упоминаю regex, только как предложение. Я использую Javascript и приветствую любую альтернативу.
Ответы
Ответ 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
в каждой позиции. На что обратить внимание:
- Вы можете указать только дату, просто время или и то, и другое + дата
- время может быть в 12-часовом или 24-часовом формате
- секунды необязательны
утра/вечера не является обязательным
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}
Ответ 10
Regular-Expressions.info - хороший источник информации о RegEx, он также имеет хороший tutorial.
Ответ 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);
}
проверьте пожалуйста