PHP正则表达式检查日期是否为YYYY-MM-DD格式

130

我想检查最终用户输入的日期格式是否为YYYY-MM-DD。正则表达式从来不是我的强项,我设置的preg_match()一直返回false。

所以我认为我在正则表达式上搞砸了,详见下文。

$date="2012-09-12";

if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
    {
        return true;
    }else{
        return false;
    }

有什么想法吗?


6
正则表达式不足以验证日期。在使用正则表达式后,你还应该使用以下两种方式之一:date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12"; 或者 PHP 的 checkdate ( int $month , int $day , int $year ) - oxygen
1
我现在并不想验证它,我只是想确保它的格式为YYYY-MM-DD。 - cosmicsafari
2
对于用户输入的值,除了在表单提交后立即进行正则表达式检验(以便您可以显示错误消息)之外,还有什么更好的“时机”来验证呢? - oxygen
公正的观点,可以避免以后的小问题。 - cosmicsafari
27个回答

1

最简单的方法是将其转换为所需的格式:

$date="2012-09-12";
$date=strtotime($date);
if($date != NULL){
    /*Valid Date*/
    $date=date("Y-m-d",$date);
    return true;
}else{
    /*InValid Date*/
    return false;
};

1

从 Laravel 5.7 开始,日期格式为:12/31/2019

function checkDateFormat(string $date): bool
{
    return preg_match("/^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/[0-9]{4}$/", $date);
}

1

在 PHP 中处理日期时,应遵循 PHP 标准,因此给定的正则表达式将确保您拥有有效的日期,可以与 PHP 一起使用。

    preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)

1
你的正则表达式有误,它无法匹配 1980-01-01 但会匹配 2100-02-29 - Toto

0

使用DateTime和> PHP 8.0的一行代码解决方案,用于检查日期的正确性。

(DateTime::createFromFormat('Y-m-d', $date) ?: null)?->format('Y-m-d') === $date

0

[如果你使用的是Symfony 4.1.2,请尝试这个][1]

  $validDate = explode("-",$request->get('date'));
        if (checkdate(filter_var($validDate[1],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[0],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[2],FILTER_SANITIZE_NUMBER_INT))){
            $date = date_create(filter_var($request->get('date'),FILTER_SANITIZE_SPECIAL_CHARS));
        }else{
            return $this->redirectToRoute('YOUR_ROUTE');
        }

0
一个更加实用的模式可能如下所示:
$date="2012-09-12";

if (preg_match("/^(20[0-9]{2})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
    return true;
} else {
    return false;
}

这将防止输入9999-09-12这样的值。


0

这种方法对于PHP中的日期验证非常有用。当前的方法适用于mm/dd/yyyy格式。您必须根据您的格式和分隔符来更新checkdate中的参数序列。

explode
    function isValidDate($dt)
    {
        $dtArr = explode('/', $dt);
        if (!empty($dtArr[0]) && !empty($dtArr[1]) && !empty($dtArr[2])) {
            return checkdate((int) $dtArr[0], (int) $dtArr[1], (int) $dtArr[2]);
        } else {
            return false;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接