Попытка проверить, имеет ли переменная следующий формат YYYY-MM-DDTHH:MM:SS.MSSZ(метка времени ISO8601), используя preg_match
Так что я пытаюсь проверить, является ли переменная со следующим форматом YYYY-MM-DDTHH:MM:SS.MSSZ
(Временная метка ISO8601) с использованием preg_match.
Что я пробовал:
$timezone = new DateTime("now", new DateTimeZone(date_default_timezone_get()));
var_dump(boolval(preg_match("/^[0-9]{4,4}-[0-9]{2,2}-[0-9]{2,2}T[0-9]{2,2}:[0-9]{2,2}:[0-9]{2,2}(Z)|(\+[0-9]{2,2}:[0-9]{2,2})$/", date("Y-m-d\TH:i:s." .round(microtime(True) * 1000). "\\" . $timezone->format('P')))));
но var_dump всегда приводит к неверным результатам... Например, когда я использую метку времени с недопустимым форматом ISO8601
Ожидаемый результат: bool(false)
и вывод: bool(true)
так что в результате bool(true)
в большинстве случаев...(не имеет значения, является ли он недействительным или действительным).
1 ответ
DateTime - это объект. Если вы делаете var_dump($timezone)
вы увидите это. С этой информацией вы можете отформатировать, как вы хотите, например:
$timezone = new DateTime("now", new DateTimeZone(date_default_timezone_get()));
var_dump($timezone->format(DateTime::ISO8601));
Выход
строка (24) "2018-07-10T12:00:53-0700"
Теперь, регулярное выражение, которое вы используете, не совпадает с вашим входным значением.
$timezone = new DateTime("now", new DateTimeZone(date_default_timezone_get()));
$timezone = date("Y-m-d\TH:i:s." .round(microtime(True) * 1000). "\\" . $timezone->format('P'));
echo $timezone; //Will Print 2018-07-10T12:04:34.1531249474906-07:00
var_dump(boolval(preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+[\-\+][0-9]{2}:[0-9]{2}/", $timezone)));
Теперь это правда.
Узнайте больше здесь: http://php.net/manual/en/class.datetime.php