PHP -Datumsformat, das falsches Datum einfügt
Frage
Ich bin verwirrt darüber, warum dieses Stück Code kein Datum im britischen Format 00/000000 in das MySQL-Datum des Datums 0000-00-00 umwandelt. Was ich in der DB bekomme, ist 1970-01-01. Es ist im Datumsformat nicht datetime, also sollte es funktionieren? Vielen Dank
$destroy = mysql_real_escape_string($_POST['destroy']);
$desttempdate=str_replace("-", "/", $destroy);
$destdate = date('Y-m-d', strtotime($desttempdate));
Lösung
Hier sind einige Optionen für Sie, um es zum Laufen zu bringen:
So etwas für PHP4:
function date2timestamp($date,$seperator='/'){
if($date!=''){
$dateEx = explode($seperator,$date);
$date = (strlen($dateEx[2])==2?'20'.$dateEx[2]:$dateEx[2]).'-'.$dateEx[1].'-'.$dateEx[0].' 00:00:00';
}
return $date;
}
Für PHP5.3 Verwendung CreateFromFormat ():
$date = DateTime::createFromFormat('j/M/Y', $UK_date);
echo $date->format('Y-m-d');
Auch weitere Optionen für createfromFormat () in Php5.2 umfassen:
Andere Tipps
strtotime()
Funktion gibt Unix Timestamp zurück und 0000-00-00
Datum passt nicht in das - Sie werden einfach bekommen 0
(Null) Stattdessen, was richtig konvertiert wird, um 1970-01-01
.
Sie können tun, was Sie wollen, indem Sie so etwas tun:
$destdate = mysql_real_escape_string($_POST['destroy']); // assuming YYYY/MM/DD
$destdate = str_replace('/', '-', $destdate);
if ($destdate != '0000-00-00'){
$destdate = date('Y-m-d', strtotime($desttempdate));
}
Das Problem ist, dass Sie angehen strtotime
Was es denkt, ist ein ungültiges Datum. Die Dokumentation sagt:
Notiz:
Die Daten in den m/d/y- oder dmy -Formaten werden durch Betrachtung des Trennscheiders zwischen den verschiedenen Komponenten disambiguiert: Wenn das Separator ein Schrägstrich (/) ist, wird der amerikanische m/d/y angenommen; Wenn das Trennzeichen ein Armaturenbrett (-) oder ein Punkt (.) ist, wird das europäische DMY-Format angenommen.
Um potenzielle Unklarheiten zu vermeiden, ist es am besten, ISO 8601 (YYYY-MM-DD) -Daten oder DateTime :: CreateFromFormat () zu verwenden, wenn möglich.
Also, was hier passiert /
Trennzeichen, was das bedeutet strtotime
versucht es zu analysieren als m/d/y
Anstatt von d/m/y
. Entweder ersetzen Sie den Ersatz überhaupt nicht, wenn sich Ihr Datum im europäischen Format befindet, oder noch besser verwenden DateTime::createFromFormat()
Wie die Dokumente vorschlagen.
Sie können überprüfen, ob dies tatsächlich das Problem ist, indem Sie den Rückgabewert von überprüfen strtotime
:
$destroy = mysql_real_escape_string($_POST['destroy']);
$desttempdate=str_replace("-", "/", $destroy);
var_dump(strtotime($desttempdate));
Dies gibt "bool (false)" aus und bestätigt dies strtotime
kann seine Eingabe nicht analysieren.
Lösung:
Wie oben erwähnt, bevorzugen DateTime::createFromFormat()
:
$date = DateTime::createFromFormat('d/m/Y', $_POST['destroy']);
$destdate = $date->format('Y-m-d');
Andernfalls wäre der einfachste Weg, das Problem zu beheben, auch wenn ich diesen Ansatz nicht empfehle, einfach darin bestehen, die zu überspringen str_replace
:
$destdate = date('Y-m-d', strtotime($_POST['destroy']));