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

Php 尝试使用preg_match检查变量是否具有以下格式YYYY-MM-DDTHH:MM:SS.MSSZ(ISO8601时间戳),php,timestamp,preg-match,iso8601,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}

因此,我尝试使用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_转储总是导致无效的结果。。。 例如,当我使用无效ISO8601格式的时间戳时

预期结果:
bool(false)
和输出:
bool(true)


因此,在大多数情况下,它会导致bool(true)(不管它是无效的还是有效的)。

日期时间是一个对象。如果你做一个
var\u 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)));
现在这是真的


阅读这里的更多内容:

我使用DateTime对象只是为了看看它是否有效(regex脚本)。您无法将对象与字符串进行比较。它总是返回false。如果你像我在这里写的代码一样格式化,你会得到ISO8601的输出,这是你想要的格式。不需要使用正则表达式进行验证。那么解决方案是什么呢?出于某些原因,我必须在执行下一个操作之前验证timestamp参数……您想做什么?如果需要生成ISO8601日期,请使用函数格式。如果需要验证IS8601正则表达式,请使用我的正则表达式。如果需要验证不同的值,请显示需要验证的值,以便我们可以帮助您。对于
2018-07-10T21:32:39.1531251159800+02:00
,它返回
bool(false)
(无效结果)