3 Stimmen

date_create_from_format akzeptiert ungültige Daten als Eingabe

PHP date_create_from_format Funktion akzeptiert nicht existierende, aber formatgültige Daten.

Ich möchte, dass sich diese Funktion wie die Funktion date Befehl:

niloct@HP-Mini:~$ date --date="29/02/2011" +%s
date: invalid date `29/02/2011'

obwohl dies in PHP der Fall ist:

$tmp = date_create_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00", timezone_open('America/Sao_Paulo'));
var_dump($tmp);
/*
output: object(DateTime)#28 (3) { ["date"]=> string(19) "2011-03-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(17) "America/Sao_Paulo" }
*/

Kann diese automatische Umwandlung vermieden werden und die Funktion -1 in diesem Fall?

niloct@HP-Mini:~$ php -v
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:08:14) 

Ich danke Ihnen.

5voto

Jon Punkte 411383

Sie können eine Kombination verwenden aus date_parse_from_format y checkdate um zu sehen, ob es ein gültiges Kalenderdatum ist.

Beispiel:

$date = date_parse_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00");

if (checkdate($date['month'], $date['day'], $date['year'])) {
    echo "Valid date";
}
else {
    echo "Invalid date";
}

0voto

Niloct Punkte 8851

Ich fand, dass der Anruf date_get_last_errors nach date_create_from_format gibt Ihnen bereits alle Arten von Validierungen für die geparste Zeichenkette in den Arrays warnings y errors und Zähler warning_count y error_count .

Es reicht also aus, die Zähler auf null Warnungen und Fehler zu überprüfen.

Überarbeiteter Code mit einigen Tests:

<?
$appTZ = 'America/Sao_Paulo';

function datetimeCreateErrorsWarnings() {
    $obj = date_get_last_errors();  
    return ($obj['error_count'] > 0) || ($obj['warning_count'] > 0);
}

function datetimeToUnixTS($data) {
    global $appTZ;

    $fmt = "d/m/Y H:i:s";

    $dtobj = date_create_from_format($fmt, $data . " 00:00:00", timezone_open($appTZ)); 

    if ($dtobj) {
        if (!datetimeCreateErrorsWarnings()) {
            return date_timestamp_get($dtobj);
        }
    }

    //Second try, $data is auto-suficient
    $dtobj = date_create_from_format($fmt, $data, timezone_open($appTZ));

    if ($dtobj) {
        if (!datetimeCreateErrorsWarnings()) {
            return date_timestamp_get($dtobj);
        }
    }

    return -1;
}

$test = array(
    'asdfasdf',
    '',
    "28/02/2011",
    "29/02/2011",
    "28/02/2011 00:00:90"
);

for ($i=0; $i<count($test); $i++) {
    $tmp = datetimeToUnixTS($test[$i]);
    var_dump($tmp);
    echo "<p>";
}
?>

Das obige Skript berechnet den Unix-Zeitstempel der erstellten Datetime.

-1voto

user2102442 Punkte 1

Das wird funktionieren:

 $format = 'd/m/Y H:i';
   $date = DateTime::createFromFormat($format, Input::get('start_date'));

  return $date->format('Y/m/d H:i');

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X