如何用 PHP 检查字串是否为合法的日期?

How to check string is a valid date in PHP?

提供几个方案:

  1. regex
  2. DateTime
  3. strtotime

Regex

优点:

  • 直觉
  • 可以练一下正规表达式

缺点:

  • 不同月份天数不同检查比较麻烦,可能要写的很复杂;
    像是下面的写法,输入 2021-06-31 会过,但6月没有31号
public function validateDate(string $date)
{
    return (bool)preg_match(
        "/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",
        $date
    );
}

DateTime

优点:

  • 可以检查多种格式(format)
  • 可以检查不同月份天数,例如 2021-02-29 可以检查出错
/**
 *
 * Validate if input string is valid DATE format
 *
 * @param    string  $date   Such as "2020-12-12"
 * @param    string  $format Validation rule will depands on this
 * @return   boolean         If date format valid, return true
 *
 */
public function validateDate(string $date, string $format = 'Y-m-d')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

strtotime

优点:

  • 同上,但更简短
public function validateDate(string $date, string $format = 'Y-m-d')
{
    return date($format, strtotime($date)) == $date;
}

References


<<:  5. bind, call, apply 的差异

>>:  【Day06】提升(Hoisting)

Day 21 - ESG已经是个不可不知的显学

图片来源 延续上一篇所谈的气候变迁与净零碳排, 在大势所趋之下, 近年无论是在投资与企业经营上的一...

[Day14] - Django Admin 介绍

Django 框架一个强大的特色,就是他自备後台管理系统(拍手)! 虽然说开发者习惯惯用程序去修改和...

POCO_设定所有Table继承同一个class

因为专案刚好需要用到 所以纪录一下参数在哪边 纪录一下 使用Visual Studio Entity...

Day3 安装 Laravel + Composor

其实我超级犹豫要不要写这篇的主题,但最後还是决定写了,如果不需要快速跳过就好XD 犹豫的原因是因为只...

day4: 程序码的命名 (function, event, customer hook)

在 function 的命名上时常犯的错会以过度简单的命名,造成无法理解该 function 做的事...