Php tarih biçimini doğrulamak

6 Cevap php

Ben PHP kullanarak tarihini doğrulamak çalışıyorum.

Ben geçerli olabilmesi için aşağıdaki biçimleri gibi olur:

d/m/yy
d/m/yyyy
dd/m/yy
dd/m/yyyy
d/mm/yy
d/mm/yyyy
dd/mm/yy
dd/mm/yyyy

Ben çok düzenli ifadeler ve checkdate () fonksiyonunun farklı varyasyonları denedim. Şu anda böyle bir şey var:

function _date_is_valid($str)
{
     if(strlen($str) == 0)
         return TRUE;
     if(substr_count($str,'/') == 2)
     {
         if (preg_match("/^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2}))/", $str))
         {
             $datearray = explode('/',$str);
             if($datearray[2] > 2030)
                 return FALSE;
             return checkdate($datearray[1], $datearray[0], $datearray[2]);
         } 
         else 
         {
             return FALSE;
         }
     }
     return FALSE;
}

Ancak bu, 11/11/200 ve 11/11/200 # gibi tarihleri ​​doğrular

Nasıl gerekli formatı maç için tarih doğrulayabilir?

Düzenleme: [2] 10 ve 30 ile 2010 ve 2030 yılları arasında olmak datearray kontrol edebilir Ama regex kullanarak bunu kontrol etmek için bir yol var.?

Edit1: Olay böylece başkası zamanlamayı hak ve daha sonra belirli bir tarihe olay atamak oluşacak zaman kullanıcıların bilmeden olayları eklemek mümkün olmak istiyorum, çünkü == 0 olan strlen ($ str) TRUE döndürür


Sadece kayıt için. Ben yapıyorum sona erdi:

function _date_is_valid($str)
{
    if(strlen($str) == 0) //To accept entries without a date
        return TRUE;
    if(substr_count($str,'/') == 2)
    {
        list($d,$m,$y) = explode('/',$str);
        if(($y >= 10 && $y <= 30) || ($y >= 2010 && $y <= 2030))
        {
            return checkdate($m,$d,$y);
        }
    }
    return FALSE;
}

Tüm cevaplar için teşekkürler

6 Cevap

Bu deneyin:

function _date_is_valid($str) {
    if (strlen($str) == 0) {
        return TRUE;
    }
    return preg_match('/^(\d{1,2})\/(\d{1,2})\/((?:\d{2}){1,2})$/', $str, $match) && checkdate($match[2], $match[1], $match[3]) && $match[2] <= 2030;
}

Ben sadece sizin gibi formatta tarih her türlü doğrulamak ve dönecekleri, martin yukarıdaki cevap değişiyor.

Sadece komut strftime'a ("10-10-2012", strtotime ($ dt)) hattı altında düzenleyerek biçimini değiştirmek;

<?php

        echo is_date("13/04/10");

        function is_date( $str )
        {
        $flag = strpos($str, '/');

        if(intval($flag)<=0){
          $stamp = strtotime( $str );
         }else {
          list($d, $m, $y) = explode('/', $str);      
          $stamp = strtotime("$d-$m-$y");
         } 
          //var_dump($stamp) ;

          if (!is_numeric($stamp))
          {
             //echo "ho" ;
             return "not a date" ;       
          }

          $month = date( 'n', $stamp ); // use n to get date in correct format
          $day   = date( 'd', $stamp );
          $year  = date( 'Y', $stamp );

          if (checkdate($month, $day, $year))
          {
             $dt = "$year-$month-$day" ;
             return strftime("%d-%b-%Y", strtotime($dt));
             //return TRUE;
          }else {
          return "not a date" ;
          }
         }

    ?>

Ben basit olduğunu doğrulamak için ne yaptığını

    function dateValidate($pDate) {
    if(empty($pDate)) 
        return true; 
    $chDate = date('Y-m-d', strtotime($pDate));
    if($chDate != '1970-01-01')
        return true;
    else 
        return false;
}

Siz de regexpi kullanarak bunu öğrenebilirsiniz

Bunu yapmanın kolay bir yolu

<?php
    if(!$formated_date = date_create_from_format('Y-m-d',$dateVar))

nasıl if(strtotime($str) !== FALSE) $valid = TRUE;