检测日期是否为数字日期(而不是相对格式)

时间:2018-01-31 10:58:23

标签: php date

我有一些来自用户inpout和系统的各种字段。如果变量是日期,那么我不知道所有变量的上下文,也不是系统的预期日期格式。 如果用户回复某个字段'您何时需要它?由现在',我不希望将该值视为当前日期。

您是否有一种简单的方法可以检测日期是否为http://php.net/manual/en/datetime.formats.date.php

之类的有效日期

但是不是 strtotime的有效字符串?

预期的测试集是:[$input, $expected]

[new \DateTime(), true],
[new \DateTimeImmutable(), true],
['2000-01-01', true],
['31/12/2000', true],
['01-01-1995', true],
['@1306123200', true],
['2010-04-25 02:24:16+12:00', true],

['12/31/2000', false],
['31/31/2000', false],
['now', false],
['next week', false],
[new \DateTimeZone('Europe/Paris'), false],
[false, false],
[0, false],
[true, false],
[1, false],
['1', false],
['1.1', false],
["", false],
[null, false],
[[], false],
[new \stdClass(), false],
["hi", false],

到目前为止,我通过检查单词进行检查:

foreach (['day', 'month', 'year', 'next', 'last', 'previous', 'this', 'ago', 'week', 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'now'] as $needle) {
        $res = strpos($value, $needle);
        if ($res !== false) {
            return false;
        }
    }

然后尝试创建日期对象

try {
    new \DateTime((string) $value);
    return true;
} catch (\Exception $e) {

全功能:

public function isDate($value)
{
    if ($value instanceof \DateTimeInterface) {
        return true;
    }

    if ($value === false || $value === null || $value === '') {
        return false;
    }

    if (is_numeric($value)) {
        return false;
    }

    //protection for strtotime valid strings
    if (is_string($value)) {
        //1999-19-19 should pass
        if (strpos($value, '-') && !preg_match('/[0-9]-[0-9]/', $value)) {
            return false;
        }
        //2010-04-25 02:24:16+12:00 should pass
        if (strpos($value, '+') && !preg_match('/[0-9]+[0-9]/', $value)) {
            return false;
        }

        foreach (['day', 'month', 'year', 'next', 'last', 'previous', 'this', 'ago', 'week', 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'now'] as $needle) {
            $res = strpos($value, $needle);
            if ($res !== false) {
                return false;
            }
        }
    }

    try {
        new \DateTime((string) $value);
        return true;
    } catch (\Exception $e) {

    }

    return false;
}

0 个答案:

没有答案