【问题标题】:PHP checkdate variantsPHP 检查日期变体
【发布时间】:2012-06-16 15:22:05
【问题描述】:

我找到了一个 php 函数 checkdate() ,但奇怪的是它似乎只接受 int $month , int $day , int $year 格式的数据。但是我将日期作为字符串传递(例如"2012-06-13"),所以我想出了这个解决方法,因为我只允许以这种格式输入日期。不幸的是,我觉得这既不安全又不是解决问题的好方法:

function CheckAdditional($value)
{
    $data = explode("-", $value);

    return checkdate($data[1], $data[2], $data[0]);
}

问题:有没有更好的方法来检查日期是否有效?

【问题讨论】:

  • 我认为您的方法没有任何问题。干净简单。
  • 有“有效”,然后有“正确”——你的目标是哪一个? 01/02/03 是有效的,但根据你的阅读方式,它可能非常非常不正确。
  • 你认为不安全的部分是什么?
  • @MarcB - 我希望数据既有效又正确。很抱歉造成混乱。
  • 我认为他的意思是从客户端获取数据,他可能有 js 验证但仍然在服务器端你可能需要一些保护。

标签: php validation date


【解决方案1】:

你可以试试:

function checkDateFormat($date){  
//match the format of the date  
if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts))  {    
    //check weather the date is valid of not        

    if(checkdate($parts[2],$parts[3],$parts[1]))          
       return true;        
    else         
       return false;  
    }  
else    
return false;}

致谢:http://roshanbh.com.np/2008/05/date-format-validation-php.html

【讨论】:

  • 令人惊讶的是,这是迄今为止最好的答案。
【解决方案2】:

如果您将用户输入限制为仅在一种格式中有效(本地化呢?),那么您可以自己解析输入,使用正则表达式函数或将输入拆分为“-”并检查它是否变成一个三位数的数组……

【讨论】:

    【解决方案3】:

    为了安全起见,你可以这样做

    date("Y-m-d", strtotime($yourdatestr));
    

    这样,即使格式可能是错误的,它也会在大多数情况下纠正它。

    【讨论】:

    • 请记住 strtotime() 可以返回 false。它还可以调整日期,例如2012-02-31应该是2012-03-02(我认为)。
    • 2012-02-31 日期无效!因此它确实返回了可能的有效日期。
    • date('Y-m-d', strtotime('test')); - 嗯,这实际上看起来是一个非常有趣的选项。因为这个函数总是返回一个日期,所以我可以比较字符串,现在它看起来是个好东西!
    • @Nasaralla:确实,日期无效,但这种方法使其有效。根据 OP 的要求,这可能不是一个好主意。
    • 是的,我明白,那么检查日期没有意义......嗯
    【解决方案4】:
    <?php
    
    function CheckAdditional($value)
    {
        return date('Y-m-d', strtotime($value)) == $value;
    }
    
    ?>
    

    经过我和试图帮助我回答的人的多次测试后,我想出了这个非常适合我的解决方案,在我看来既简单又非常可靠,因为没有人能够证明它是错误的到目前为止。

    【讨论】:

    • 就其本身而言,这是错误的(1 位输入就足够了)。另外,它比checkdate() 更糟糕。
    • 1 digit input suffices 是什么意思?
    【解决方案5】:
    function DDC($dates){ // Date Day Control
        $dy = substr($dates,0,4);
        $dm = substr($dates,5,2);
        $dd = substr($dates,8,2);
        for($i=0; $i<3; $i++){
            if(!checkdate($dm,$dd,$dy)){
                $dd--;
            }else{$i=3;}
        }
        return $dy.'.'.$dm.'.'.$dd;
    }
    echo DDC('2013.02.31');
    //2013.02.28
    

    【讨论】:

      【解决方案6】:
      $jahr = (int) $_POST['jahr'];
      $monat =  (int) $_POST['monat'];
      $tag = (int) $_POST['tag'];
      $datum = "$tag. $monat. $jahr";
      
      if (checkdate($monat, $tag, $jahr) == FALSE) {
          $allesok = false;
          $fehlermeldung .= "<p class='fehler'>Ungültiges Datum $datum!</p>";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 2013-10-04
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        相关资源
        最近更新 更多