PHP 验证 ISO 8601 日期字符串

2022-08-30 18:10:19

如何验证 ISO 8601 日期字符串(例如:2011-10-02T23:25:42Z)。

我知道ISO 8601日期有几种可能的表示形式,但我只对验证我上面给出的示例格式感兴趣。

谢谢!


答案 1

这对我有用,它使用正则表达式来确保日期采用所需的格式,然后尝试解析日期并重新创建它以确保输出与输入匹配:

<?php

$date = '2011-10-02T23:25:42Z';
var_dump(validateDate($date));

$date = '2011-17-17T23:25:42Z';
var_dump(validateDate($date));

function validateDate($date)
{
    if (preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/', $date, $parts) == true) {
        $time = gmmktime($parts[4], $parts[5], $parts[6], $parts[2], $parts[3], $parts[1]);

        $input_time = strtotime($date);
        if ($input_time === false) return false;

        return $input_time == $time;
    } else {
        return false;
    }
}

您可以进一步扩展以使用checkdate,以确保月日和年也有效。


答案 2

我想分享我的轻量级解决方案。这并不理想,但可能对某人有所帮助。

function validISO8601Date($value)
{
    if (!is_string($value)) {
        return false;
    }

    $dateTime = \DateTime::createFromFormat(\DateTime::ISO8601, $value);

    if ($dateTime) {
        return $dateTime->format(\DateTime::ISO8601) === $value;
    }

    return false;
}

阿登特!

某些有效的 ISO8601 日期将失败查看下面的列表

NOT VALID  --> '' // Correct
NOT VALID  --> 'string' // Correct
VALID      --> '2000-01-01T01:00:00+1200' // This is the only format function returns as valid
NOT VALID  --> '2015-01 first' // Correct
NOT VALID  --> '2000-01-01T01:00:00Z' // Must be valid!
NOT VALID  --> '2000-01-01T01:00:00+01' // Must be valid!

推荐