使用php验证RFC3339日期时间

使用php验证RFC3339日期时间,php,validation,datetime,rfc3339,Php,Validation,Datetime,Rfc3339,如何验证日期时间是否有效RFC3339?我知道我可以将其转换为unix时间,然后将其格式化为有效的RFC3339,但我不希望这样做,而是强制要求提供正确的格式。建议使用regex,这只是最后一种手段。如果您决定使用regex,请感谢,您可以使用以下代码: preg_match('/^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]

如何验证日期时间是否有效RFC3339?我知道我可以将其转换为unix时间,然后将其格式化为有效的RFC3339,但我不希望这样做,而是强制要求提供正确的格式。建议使用regex,这只是最后一种手段。如果您决定使用regex,请感谢,您可以使用以下代码:

preg_match('/^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(([Zz])|([\+|\-]([01][0-9]|2[0-3]):[0-5][0-9]))$/', $time);

如果$time与正则表达式匹配,则返回true。

DateTime
具有预定义的
DateTime::rfc339
格式常量。由于
createFromFormat
返回
false
如果无法根据提供的格式解析日期,则可以使用该检查作为验证器:

validRFC3339Date("2018-01-29T20:36:01Z");
validRFC3339Date("2018-01-29T20:36:01+00:00");

validRFC3339Date("2018-01-22 20:36");
validRFC3339Date("2018-09-28T16:00:05.000Z");

function validRFC3339Date($date) {
    if (DateTime::createFromFormat(DateTime::RFC3339, $date) === FALSE) {
        echo "$date: Invalid RFC3339\n";
    } else {
        echo "$date: Valid RFC3339\n";
    }
}

谢谢Xxmarijnw,你认为这种模式比我引用的模式更可取吗?@msg。是的,这将允许我格式化为RFC3339,但如何使用它来验证日期时间字符串?很好的解决方案。谢谢这还不够。您还必须检查新常量
DateTime::RFC3339\u EXTENDED