【问题标题】:Verify valid date using PHP's DateTime class使用 PHP 的 DateTime 类验证有效日期
【发布时间】:2013-01-24 15:29:50
【问题描述】:

以下是我之前验证日期的方式。我也有自己的函数来转换日期格式,但是,现在使用 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);
}

【问题讨论】:

  • 说你使用的是面向对象的风格,然后呈现一个静态定义的函数似乎有点奇怪。

标签: php datetime


【解决方案1】:

你可以试试这个:

static public function verifyDate($date)
{
    return (DateTime::createFromFormat('m/d/Y', $date) !== false);
}

这会输出真/假。您可以直接返回DateTime 对象:

static public function verifyDate($date)
{
    return DateTime::createFromFormat('m/d/Y', $date);
}

然后你会返回一个 DateTime 对象或失败时返回 false。

更新:

感谢 Elvis Ciotti,他表明 createFromFormat 接受无效日期,例如 2014 年 4 月 45 日。 更多信息:https://stackoverflow.com/a/10120725/1948627

我用严格的检查选项扩展了该方法:

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;
}

【讨论】:

  • 感谢 Redreggae,看起来这会奏效。如果我不关心原始格式而只关心它是有效日期,您是否建议只创建一个新的 DateTime($data) 并使用异常?
  • 我已经更新了我的答案...异常不会有帮助,因为该方法不会在失败时抛出异常只返回false
  • 抱歉没有正确回答您的问题。如果你不关心日期格式,那么shadyyx的解决方案更好。
  • 小心DateTime::createFromFormat('Y-m-d', '2014-21-31')->format('d/m/Y') 输出01/10/2015,而不是false
  • @ElvisCiotti 感谢您提供此信息。我已经更新了。
【解决方案2】:

使用 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

函数是从 answerphp.net 复制而来的

【讨论】:

  • 这不适用于以下格式:!m/Yd-m-Y|。在这种情况下需要额外的解析。
【解决方案3】:

您可以查看此资源:http://php.net/manual/en/datetime.getlasterrors.php

PHP 代码指出:

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

【讨论】:

  • 如果字符串是0000-00-00 00:00:00,这不会抛出异常
  • 这个问题 - 实际上不是代码的问题,而是 PHP 的错误 - 从 24:00 到 24:59 时间被接受而没有错误。
【解决方案4】:

试试这个:

  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);
  }

【讨论】:

  • 更简洁和安全(检查两个计数器:warning_count 和 error_count)。我只想添加第三个条件(以防万一):$f !== false。
【解决方案5】:
$date[] = '20/11/2569';     
$date[] = 'lksdjflskdj'; 
$date[] = '11/21/1973 10:20:30';
$date[] = '21/11/1973 10:20:30';
$date[] = " ' or uid like '%admin%"; 
foreach($date as $dt)echo date('Y-m-d H:i:s', strtotime($dt))."\n";

输出

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

【讨论】:

    【解决方案6】:

    我需要允许用户以 (n) 种不同的、已知的格式输入...包括 microtime。以下是 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;
    }
    

    【讨论】:

      【解决方案7】:

      使用以下空字符串,如 '' 或 0 或 '0000-00-00 00:00:00' 为 false

      $valid = strtotime($date) > 0;
      

      【讨论】:

      • 我知道这条评论已有十多年的历史了......不过,这基本上是一个正则表达式检查器,它不包括少于 31 天的月份,例如“2000-11-31”。
      猜你喜欢
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2018-08-29
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多