Regex проверяет правильную строку даты ISO8601 со временем

Например: 2015-01-17T18:23:02+00:00

Имея некоторые проблемы с регулярным выражением, поскольку определенные компоненты строки, которые считаются "действительными", предполагаются и могут не потребоваться.

Также факт, что строка может быть отформатирована как: 2015-01-17T18:23:02Z слегка меняет

Спасибо заранее, ребята.

Ответы

Ответ 1

Основываясь на более раннем ответе, вы можете сделать это и быть довольно строгим:

^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:Z|[+-][01]\d:[0-5]\d)$

Regular expression visualization

Демоверсия Debuggex

Чуть чудовищно, но он проверяет допустимые даты, включая високосный год ( здесь.

Ответ 2

Основываясь на предыдущем ответе, это регулярное выражение обрабатывает долю секунд.

^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,9})?(?:Z|[+-][01]\d:[0-5]\d)$

Debuggex Demo

Ответ 3

В этой ссылке мы видим разные форматы ISO 8601, основанные на разных значениях, которые мы хотели бы включить.

Для примера в вопросе 2015-01-17T18:23:02+00:00, ниже regex должен работать.

[0-9]{4}-[0-9]{2}-[0-9]{2}T([0-9]{2}:){2}[0-9]{2}[+|-][0-9]{2}:[0-9]{2}

Здесь [+|-] - возможные смещения часовых поясов.

Ответ 4

Если вы просто хотите соответствовать часовым поясам, используйте это:

^[+|-][0-1][0-9]:[0-5][0-9]$

Максимум + или - 19:59, что достаточно

Ответ 5

чтобы соответствовать дате и часовым поясам

2019-07-01T24:15:00+19:00

\d{4}-[01]{1}\d{1}-[0-3]{1}\d{1}T[0-2]{1}\d{1}:[0-6]{1}\d{1}:[0-6]{1}\d{1}[+|-][0-1][0-9]:[0-5][0-9]$

проверить это здесь https://regexr.com/4gmi2