BUG-Behandlung von PHP strtotime
In letzter Zeit wird strtotime in Kombination mit -1 Monat, +1 Monat, nächster Monat verwendet, um die zu erhalten vorheriger Monat oder nächster Monat Monatsdatum, aber ich habe gerade einen Artikel gesehen und festgestellt, dass die Verwendung von strtotime zum direkten Abrufen des Datums immer noch ein kleiner Fehler ist
FEHLER
Zum Beispiel , Datum:
$today = '2020-12-31'; echo date("Y-m-d",strtotime("$today -1 month"))
Ausgabe
2020-12-01
Wie aus der obigen Ausgabe ersichtlich ist, ist die Ausgabe immer noch Dezember 2020
Analyse:
Machen Sie es zuerst - 1 Monat, dann ist es aktuell der 31.07., und nach dem Subtrahieren von eins ist es der 31.06.
Machen Sie die Datumsnormalisierung erneut durch, da es im Juni keinen 31. gibt ist wie 2:60 gleich 3:00, 31. Juni gleich 1. Juli
Ist die Logik sehr „klar“? Wir können den zweiten Schritt auch manuell überprüfen, wie zum Beispiel:
var_dump(date("Y-m-d", strtotime("2020-12-31"))); // 输出2020-12-01
Mit anderen Worten, solange es um die großen und kleinen Monate geht. Am letzten Tag des Monats kann es zu dieser Verwirrung kommen. Wir können auch ähnliche andere Monate leicht überprüfen, um diese Schlussfolgerung zu bestätigen:
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2020-12-31")))); // 输出2020-12-03 var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2020-08-31")))); // 输出2020-10-01 var_dump(date("Y-m-d", strtotime("next month", strtotime("2020-01-31")))); // 输出2020-03-03 var_dump(date("Y-m-d", strtotime("last month", strtotime("2020-03-31")))); // 输出2020-03-03
Lösung
Ab PHP5 Ab .3 hat date eine Reihe von Korrekturphrasen hinzugefügt, um dieses Problem zu klären, nämlich „erster Tag von“ und „letzter Tag von“, was bedeutet, dass Sie es können Begrenzen Sie das Datum, damit das Datum nicht automatisch „normalisiert“ wird:
var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2020-03-31")))); //输出2020-02-28 var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2020-08-31")))); //输出2020-09-01 var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2020-01-31")))); //输出2020-02-01 var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2020-03-31")))); //输出2020-02-28
Wenn es sich um eine Version vor 5.3 handelt, können Sie mktime oder ähnliches verwenden, um alle Tage einfach zu ignorieren Sie auf den 1. eines jeden Monats, aber es ist besser, den ersten Tag direkt zu verwenden.
Empfohlenes Tutorial: „PHP-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonUmgang mit PHP strtotime BUG. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!