geçerli bir tarih, garip tarih dönüşümleri için php onay

7 Cevap php

Bir tarih / zaman geçerli ise bu kontrol etmek kolay olacağını düşünürdüm görmek için kontrol etmek için bir yolu var mı:

$date = '0000-00-00';
$time = '00:00:00';
$dateTime = $date . ' ' . $time;

if(strtotime($dateTime)) {
    // why is this valid?
}

ne gerçekten beni alır şudur:

echo date('Y-m-d', strtotime($date));

in sonuçları: "1999-11-30"

ha? i 1999/11/30 için 0000-00-00 gitti??

Ben tarih bu değerlerden birini i have tarihe eşit ama kontrol etmek için çok sağlam bir yol değildir olup olmadığını görmek için karşılaştırma yapabileceğini biliyorum. I geçerli bir tarih olup olmadığını görmek için kontrol etmek için iyi bir yolu var mı? Herkes bu kontrol etmek için iyi bir işlevi var?

Edit: People are asking what i'm running: Running PHP 5.2.5 (cli) (built: Jul 23 2008 11:32:27) on Linux localhost 2.6.18-53.1.14.el5 #1 SMP Wed Mar 5 11:36:49 EST 2008 i686 i686 i386 GNU/Linux

7 Cevap

Dan php.net

<?php
function isValidDateTime($dateTime)
{
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $dateTime, $matches)) {
        if (checkdate($matches[2], $matches[3], $matches[1])) {
            return true;
        }
    }

    return false;
}
?>

echo date ('Y-m-d', strtotime ($ tarih));

"1999-11-30": sonuçları

Sonucu, strtotime 943920000 - bu 1999-11-30 için Unix epoch (zaman ölçülür başka baz) arasında yaklaşık saniye sayısıdır, vardır.

Orada bir documented mysql bug on mktime(), localtime(), strtotime() tüm ("0000-00-00 00:00:00" dahil) öncesi dönem zamanı çalıştığınızda bu garip değer döndüren. Bu aslında bir hata olup olmadığı gibi bağlantılı parçacığı üzerinde bazı tartışmalar var:

Since the time stamp is started from 1970, I don't think it supposed to work in anyways.

Aşağıda "0000-00-00 00:00:00" ötesinde tarihler için, size bazı kullanım olabilir, hangi vb karşılaştırmalar için bir zaman damgası gibi yukarıdaki gibi tarihsaat dönüştürmek için kullanabileceğiniz bir işlevdir

/**
 * Converts strings of the format "YYYY-MM-DD HH:MM:SS" into php dates
 */
function convert_date_string($date_string)
{
    list($date, $time) = explode(" ", $date_string);
    list($hours, $minutes, $seconds) = explode(":", $time);
    list($year, $month, $day) = explode("-", $date);
    return mktime($hours, $minutes, $seconds, $month, $day, $year);
}

Burada belirtildiği gibi: https://bugs.php.net/bug.php?id=45647

There is no bug here, 00-00-00 means 2000-00-00, which is 1999-12-00, which is 1999-11-30. No bug, perfectly normal.

Ve geriye doğru yuvarlanan bir kaç test ile gösterildiği gibi beklenen davranış, biraz rahatsız edici eğer edilir:

>> date('Y-m-d', strtotime('2012-03-00'))
string: '2012-02-29'
>> date('Y-m-d', strtotime('2012-02-00'))
string: '2012-01-31'
>> date('Y-m-d', strtotime('2012-01-00'))
string: '2011-12-31'
>> date('Y-m-d', strtotime('2012-00-00'))
string: '2011-11-30'

Eğer bu aralığın dışında olduğunuzda tutarlı sonuçlar beklemeyin:

cf strtotime

cf Gnu Calendar-date-items. html

"For numeric months, the ISO 8601 format ‘year-month-day’ is allowed, where year is any positive number, month is a number between 01 and 12, and day is a number between 01 and 31. A leading zero must be present if a number is less than ten."

Yani '0000-00-00 'garip sonuçlar verir, bu mantıklı!


"Additionally, not all platforms support negative timestamps, therefore your date range may be limited to no earlier than the Unix epoch. This means that e.g. %e, %T, %R and %D (there might be more) and dates prior to Jan 1, 1970 will not work on Windows, some Linux distributions, and a few other operating systems."

cf strftime


checkdate fonksiyonu yerine (daha sağlam) kullanın:

month: The month is between 1 and 12 inclusive.

day: The day is within the allowed number of days for the given month. Leap year s are taken into consideration.

year: The year is between 1 and 32767 inclusive.

Alan boş olması için bu sürüm sağlar, aa / gg / yy veya gg / aa / yyyy formatında tarihleri ​​var, tek haneli saat için izin, isteğe bağlı am / pm ekler ve zaman maçta bazı ince kusurları düzeltir.

14 AM ': Halen '23 gibi bazı patolojik kez sağlar.

function isValidDateTime($dateTime) {
    if (trim($dateTime) == '') {
        return true;
    }
    if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})(\s+(([01]?[0-9])|(2[0-3]))(:[0-5][0-9]){0,2}(\s+(am|pm))?)?$/i', $dateTime, $matches)) {
        list($all,$mm,$dd,$year) = $matches;
        if ($year <= 99) {
            $year += 2000;
        }
        return checkdate($mm, $dd, $year);
    }
    return false;
}

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

Just change the format by editing below line of script strftime("10-10-2012", strtotime($dt));

<?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 ExtJS uygulamalardan gelen tarihlerini doğrulamak için aşağıdakileri kullanabilirsiniz.

function check_sql_date_format($date) {
 $date = substr($date, 0, 10);
 list($year, $month, $day) = explode('-', $date);
 if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) {
     return false;
 }
 return checkdate($month, $day, $year);

}