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