尝试使用preg_match检查变量是否具有以下格式YYYY-MM-DDTHH:MM:SS.MSSZ(ISO8601 timestamp)

时间:2018-07-10 18:56:43

标签: php timestamp preg-match iso8601

所以我正在尝试使用preg_match检查变量是否具有以下格式YYYY-MM-DDTHH:MM:SS.MSSZ(ISO8601时间戳)。

我尝试过的事情:

$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 个答案:

答案 0 :(得分:0)

DateTime是一个对象。如果您执行var_dump($timezone),将会看到。 有了这些信息,您就可以像这样格式化:

$timezone = new DateTime("now", new DateTimeZone(date_default_timezone_get()));
var_dump($timezone->format(DateTime::ISO8601));

输出

  

string(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