使用PHP'验证有效日期;日期时间类

使用PHP'验证有效日期;日期时间类,php,datetime,Php,Datetime,下面是我以前如何验证日期的。我也有自己的函数来转换日期格式,但是,现在我使用PHP的DateTime类,所以不再需要它们。如何最好地使用DataTime验证有效日期?还请让我知道您是否认为我应该首先使用DataTime。谢谢 我使用的是面向对象的风格,而不是程序风格 static public function verifyDate($date) { //Given m/d/Y and returns date if valid, else NULL. $d=explode('/',$d

下面是我以前如何验证日期的。我也有自己的函数来转换日期格式,但是,现在我使用PHP的DateTime类,所以不再需要它们。如何最好地使用DataTime验证有效日期?还请让我知道您是否认为我应该首先使用DataTime。谢谢

我使用的是面向对象的风格,而不是程序风格

static public function verifyDate($date)
{
  //Given m/d/Y and returns date if valid, else NULL.
  $d=explode('/',$date);
  return ((isset($d[0])&&isset($d[1])&&isset($d[2]))?(checkdate($d[0],$d[1],$d[2])?$date:NULL):NULL);
}
你可以试试这个:

static public function verifyDate($date)
{
    return (DateTime::createFromFormat('m/d/Y', $date) !== false);
}
这将输出true/false。您可以直接返回
DateTime
对象:

static public function verifyDate($date)
{
    return DateTime::createFromFormat('m/d/Y', $date);
}
然后返回一个
DateTime
对象,失败时返回false

更新:

感谢Elvis Ciotti证明createFromFormat接受无效日期,如2014年4月45日。 有关这方面的更多信息:

我通过一个严格的检查选项扩展了该方法:

static public function verifyDate($date, $strict = true)
{
    $dateTime = DateTime::createFromFormat('m/d/Y', $date);
    if ($strict) {
        $errors = DateTime::getLastErrors();
        if (!empty($errors['warning_count'])) {
            return false;
        }
    }
    return $dateTime !== false;
}

您可以检查此资源:

PHP代码说明:

try {
    $date = new DateTime('asdfasdf');
} catch (Exception $e) {
    print_r(DateTime::getLastErrors());
    // or
    echo $e->getMessage();
}
试试这个:

  function is_valid_date($date,$format='dmY')
  {
    $f = DateTime::createFromFormat($format, $date);
    $valid = DateTime::getLastErrors();         
    return ($valid['warning_count']==0 and $valid['error_count']==0);
  }

使用DateTime,您可以为所有格式创建最短的日期和时间验证器

function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

var_dump(validateDate('2012-02-28 12:12:12')); # true
var_dump(validateDate('2012-02-30 12:12:12')); # false
函数是从此或复制的

输出

1970-01-01 05:30:00
1970-01-01 05:30:00
1970-01-01 05:30:00
1973-11-21 10:20:30
1970-01-01 05:30:00
1970-01-01 05:30:00

我需要允许用户以(n)种不同的已知格式进行输入…包括微时间。下面是一个带有3的示例

function validateDate($date)
{
    $formats = ['Y-m-d','Y-m-d H:i:s','Y-m-d H:i:s.u'];
    foreach($formats as $format) {
        $d = DateTime::createFromFormat($format, $date);
        if ($d && $d->format($format) == $date) return true;
    }
    return false;
}

谢谢雷德雷盖,看来这会有用的。如果我不关心原始格式,只关心它是一个有效的日期,你会建议只创建一个新的日期时间($data),并使用异常吗?我已经更新了我的答案…异常不会有帮助,因为该方法不会在失败时抛出异常,只会返回
false
。对不起,没有正确回答你的问题。如果您不关心日期格式,那么shadyyx的解决方案会更好。小心
DateTime::createFromFormat('Y-m-d','2014-21-31')->格式('d/m/Y')
输出
01/10/2015
,而不是
false
@elviscioti感谢您提供此信息。我做了一个更新。说您使用的是OO风格,然后显示一个静态定义的函数,这似乎有点奇怪。它更简洁和安全(同时检查计数器:警告计数和错误计数)。我只想添加第三个条件(以防万一):$f!==false。如果字符串是
0000-00-00 00 00:00:00
,则不会引发异常。这一问题-实际上不是代码的问题,而是PHP的错误-从24:00到24:59的时间被接受,没有错误。这对于以下格式不成立:
!m/Y
d-m-Y
。在这种情况下,需要额外的解析。
function validateDate($date)
{
    $formats = ['Y-m-d','Y-m-d H:i:s','Y-m-d H:i:s.u'];
    foreach($formats as $format) {
        $d = DateTime::createFromFormat($format, $date);
        if ($d && $d->format($format) == $date) return true;
    }
    return false;
}