【问题标题】:Trying to check whether an variable is with the following format YYYY-MM-DDTHH:MM:SS.MSSZ(ISO8601 timestamp) using preg_match尝试使用 preg_match 检查变量是否具有以下格式 YYYY-MM-DDTHH:MM:SS.MSSZ(ISO8601 timestamp)
【发布时间】:2018-07-10 18:56:42
【问题描述】:

所以我正在尝试使用 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)...(不管它是无效还是有效)。

【问题讨论】:

    标签: php timestamp preg-match iso8601


    【解决方案1】:

    日期时间是一个对象。如果您执行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

    【讨论】:

    • 我使用 DateTime 对象只是为了查看它是否有效(正则表达式脚本)
    • 您不能将对象与字符串进行比较。它总是返回 false。如果你像我在这里写的代码那样格式化,你会得到 ISO8601 的输出,这是你想要的格式。无需使用正则表达式进行验证。
    • 那么解决方案是什么?由于某些原因,我必须在执行下一步操作之前验证时间戳参数...
    • 你想做什么?如果需要生成 ISO8601 日期,请使用函数格式。如果您需要验证 IS8601 正则表达式,请使用我的正则表达式。如果您需要验证不同的值,请显示您需要验证的值,以便我们为您提供帮助。
    • 它为2018-07-10T21:32:39.1531251159800+02:00(无效结果)返回bool(false)
    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多