Frage

Gibt es eine Möglichkeit zu überprüfen, um zu sehen, ob ein Datum / Zeit gültig ist, würden Sie denken, diese leicht sein würde, zu überprüfen:

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

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

wirklich was ich bin dies:

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

Ergebnisse in: "1999.11.30",

oder? Ich ging von 0000-00-00 bis 1999.11.30 ???

Ich weiß, ich Vergleich tun könnte, um zu sehen, ob das Datum entweder dieser Werte ist zu dem Zeitpunkt gleich i haben, aber es ist keine sehr robuste Art und Weise zu überprüfen. Gibt es ein guter Weg, um zu überprüfen, ob ich ein gültiges Datum haben? Wer eine gute Funktion, dies zu überprüfen?

Edit: Die Leute fragen, was ich ausgeführt wird: Laufende PHP 5.2.5 (cli) (gebaut: 23. Juli 2008 11.32.27) auf Linux localhost 2.6.18-53.1.14.el5 # 1 SMP Mi 5. März 11.36.49 EST 2008 i686 i686 i386 GNU / Linux

War es hilfreich?

Lösung

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

Andere Tipps

Wie hier erwähnt: https://bugs.php.net/bug.php? id = 45647

  

Es gibt keine Fehler hier, 00-00-00 bedeutet 2000-00-00, die 1999-12-00 ist,   Das ist 1999.11.30. Kein Fehler, völlig normal.

Und wie bei einigen Tests gezeigt, rückwärts rollt erwartetes Verhalten ist, wenn auch ein wenig beunruhigend:

>> 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'
  

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

     

Ergebnisse in: "1999.11.30"

Das Ergebnis strtotime ist 943920000 - das ist die Anzahl der Sekunden, in etwa zwischen der Unix Epoche (Ausgangspunkt, um die Zeit gemessen wird) zu 1999.11.30.

Es gibt eine mysql Fehler auf mktime(), localtime(), strtotime() all diesen ungeraden Wert zurückgegeben, wenn Sie eine Pre-Epoche Zeit (einschließlich „0000-00-00 00:00:00“) versuchen. Es gibt einige Diskussionen über den verlinkten Thread, ob dies tatsächlich ein Fehler:

  

Da die Zeitstempel von 1970 gestartet wird, ich denke, es ist nicht anzunehmen   arbeiten in sowieso.

Im Folgenden finden Sie eine Funktion, die ich für Vergleiche zum Umwandeln von datetime, wie die oben auf einen Zeitstempel verwenden, etc, die Sie von Nutzen sein kann, für Daten über „0000-00-00 00:00:00“

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

Erwarten Sie nicht zusammenhängende Ergebnisse, wenn Sie sich außerhalb der Reichweite sind:

strtotime

Gnu Kalender-Datum-Artikel .html

  

"Für numerische Monate, die ISO 8601   Format ‚Jahr-Monat-Tag‘ ist erlaubt,   wo Jahr eine positive Zahl ist,    Monat ist eine Zahl zwischen 01   und 12 und Tag ist ein   Zahl zwischen 01 und 31 . EIN   führende Null muss, wenn eine vorhanden sein   Zahl kleiner als zehn. "

So '0000-00-00' seltsame Ergebnisse gibt, das ist logisch!


  

"Zusätzlich nicht alle   Plattformen unterstützen negative Zeitstempel,   deshalb Ihr Datumsbereich kann   begrenzt auf nicht früher als die Unix   Epoche . Dies bedeutet, dass z.B.   % E,% T,% R und% D (es könnte sein,   mehr) und Angaben vor dem Jan   1, 1970 wird unter Windows nicht funktionieren, einige   Linux-Distributionen und einige andere   Betriebssysteme . "

Strftime


Verwenden Sie checkdate Funktion statt (robuste):

  

Monat:       Der Monat zwischen 1 und 12 einschließlich .

     

Tag:       Der Tag ist innerhalb der erlaubten Anzahl der Tage für die gegebene   Monat. Schaltjahr s getroffen werden,   in Betracht.

     

Jahr:       Das Jahr zwischen 1 und 32767 inklusive .

Diese Version ermöglicht das Feld leer zu sein, muss Daten in mm / tt / jj oder mm / tt / Format ermöglicht einstellige Stunden, fügt optional am / pm und korrigiert einige subtilen Fehler in der Zeit Spiel .

Still erlaubt einige pathologische Zeiten wie '23. 14 Uhr‘

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

Wenn Sie nur ein Datum Konvertierung zu handhaben möchten, ohne die Zeit für eine MySQL-Datumsfeld, können Sie diesen großen Code ändern, wie ich es tat. Auf meiner Version von PHP ohne Ausführen dieser Funktion erhalte ich „0000-00-00“ jedes Mal. Nervig.

function ConvertDateString ($DateString)
{
    list($year, $month, $day) = explode("-", $DateString);
    return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year));
}
<?php
function is_valid_date($user_date=false, $valid_date = "1900-01-01") {
    $user_date = date("Y-m-d H:i:s",strtotime($user_date));
    return strtotime($user_date) >= strtotime($valid_date) ? true : false;
}

echo is_valid_date("00-00-00") ? 1 : 0;    // return 0

echo is_valid_date("3/5/2011") ? 1 : 0;    // return 1

Ich habe zu ändern nur die martin oben Antwort, die jede Art von Datum zu validieren und zurück in das Format Sie möchten.

Sie einfach das Format, das von unterhalb der Linie der Bearbeitung ändern Skript 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" ;
    }
}
?>

Ich habe den folgenden Code verwendet Daten zur Validierung von ExtJS-Anwendungen kommen.

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

function is_date( $str ) {
    $stamp = strtotime( $str );

    if (!is_numeric($stamp)) {
        return FALSE;
    }
    $month = date( 'm', $stamp );
    $day   = date( 'd', $stamp );
    $year  = date( 'Y', $stamp );

    if (checkdate($month, $day, $year)) {
        return TRUE;
    }
    return FALSE;
}
?>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top