php - 尝试使用 preg_match 检查变量是否具有以下格式 YYYY-MM-DDTHH:MM:SS.MSSZ(ISO8601 timestamp)
问题描述
YYYY-MM-DDTHH:MM:SS.MSSZ
所以我正在尝试使用 preg_match检查变量是否具有以下格式(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)
在大多数情况下会导致......(它是无效还是有效都没有关系)。
解决方案
日期时间是一个对象。如果你这样做,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
推荐阅读
- sql-server - SQL 查询使用附加条件确定最旧的消息
- swift - 快速查找和更改属性字符串中的范围
- python - 如何将 keras 模型与其他数据一起保存并完全加载?
- python - PUDB 错误:
- selenium - 并行执行失败。它在一个会话和另一个会话上成功执行测试,没有执行任何操作
- spring - X-application-context-header 未传递给 openshift/liberty 中的 httpHeaders Map
- python - 与用于逻辑回归的 Scikit-Learn 相比,Tensorflow 的性能要差得多
- postgresql - postgresql 函数根据 IF ELSEIF 条件更新每一行
- json - JSON 格式不正确
- css - 当其容器/父元素悬停时将css样式应用于元素