2016-06-03 11 views
0

Verwenden Sie den folgenden Code, um zu versuchen und Y-m-d zu erhalten, und sollte 2016-05-10 zurückgeben, aber es wird stattdessen 2016-10-05 zurückgegeben.PHP-Datum Problem beim Konvertieren mit strtotime, aber wie man das richtig macht?

// m-d-Y (Month-Day-Year) 
$test_date = '05-10-2016'; 

// Convert to Y-m-d 
$convert_date = date('Y-m-d', strtotime($test_date)); 


echo $convert_date; 

Wie bekomme ich "Y-m-d" zurück? Nicht versuchen, explode('-', $test_date) zu verwenden. Ist das mit richtigen Zeitfunktionen möglich?

+2

willkommen in der wunderbaren welt von strtotime. Sie haben '-' verwendet, um die Komponenten zu trennen, also entscheidet strtotime, dass es TT-MM-JJJJ ist. Wenn du '/' benutzt hättest, würde es als 'MM/TT/JJJJ' behandelt werden. Verwenden Sie ** ** ** ** nicht, um mehrdeutige Eingaben zu analysieren. in der Tat, wenn Sie das Format der Datumszeichenkette im Voraus kennen, versuchen Sie nicht einmal, strtotime zu verwenden. benutze 'date_create_from_format()' und erhalte ein 100% zuverlässiges Parsing. –

+0

Wow, danke, wusste das nicht. –

+0

[PHP Dokumentation von Datumsformaten für strtotime()] (http://www.php.net/manual/en/datetime.formats.date.php) –

Antwort

3

Ja, verwenden DateTime Objekt dafür:

$test_date = '05-10-2016'; 
$DateTime = DateTime::createFromFormat('m-d-Y', $test_date, new DateTimeZone('utc')); 
var_dump($DateTime); 

OUTPUT

object(DateTime)[8] 
    public 'date' => string '2016-05-10 15:08:53.000000' (length=26) 
    public 'timezone_type' => int 2 
    public 'timezone' => string 'UTC' (length=3) 

So

echo $DateTime->format('Y-m-d'); //2016-05-10 
1

strtotime annehmen europäischen formatiert Daten, wenn sie von - und USA getrennt sind da te-Format, wenn sie getrennt werden durch /

Anmerkung: from the manual strtotime()

Daten in m/d/y oder DMY Formate werden disambiguiert durch zwischen den verschiedenen Komponenten in dem Separator suchen: Bei dem Separator ein Schrägstrich ist (/), dann wird das amerikanische m/d/y angenommen; während, wenn das Trennzeichen ein Strich (-) oder ein Punkt (.) ist, das europäische d-m-y-Format angenommen wird. Wenn jedoch das Jahr in einem zweistelligen Format angegeben wird und das Trennzeichen ein Bindestrich (-, wird die Datumszeichenfolge als ymd interpretiert.

Um mögliche Mehrdeutigkeiten zu vermeiden, verwenden Sie am besten ISO 8601 (JJJJ-MM- DD) Daten oder Datetime :: createFromFormat(), wenn möglich.

So können Sie nur str_replace die - für /

// m-d-Y (Month-Day-Year) 
$test_date = '05-10-2016'; 
$test_date = str_replace('-', '/', $test_date); 

// Convert to Y-m-d 
$convert_date = date('Y-m-d', strtotime($test_date)); 

echo $convert_date; 

oder besser noch die Verwendung DateTime object

1

Hinweis: Achten Sie auf Datumsangaben in den Formaten m/d/y oder d-m-y; Wenn das Trennzeichen ein Schrägstrich (/) ist, wird das amerikanische m/d/y angenommen. Wenn das Trennzeichen ein Strich (-) oder ein Punkt (.) Ist, wird das europäische d-m-y-Format angenommen. Um mögliche Fehler zu vermeiden, sollten Sie möglichst JJJJ-MM-DD-Daten oder date_create_from_format() verwenden.

Quelle:w3schools

Sie konvertieren müssen '-' durch '/'.

<?php// m-d-Y (Month-Day-Year) 
$test_date = str_replace('-', '/', '05-10-2016'); 

// Convert to Y-m-d 
$convert_date = date('Y-m-d', strtotime($test_date)); 

echo $convert_date; // 2016-05-10