Попытка проверить, имеет ли переменная следующий формат 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

Другие вопросы по тегам