Betrachten Sie diesen Code, wo wir an zweiter Stelle addieren oder subtrahieren eine wollen:Ist strtotime() einen Fehler?
date_default_timezone_set("Europe/Amsterdam");
$time = 1477789199;
echo $time . ' - ' . date('r', $time) . "\n";
// 1477789199 - Sun, 30 Oct 2016 02:59:59 +0200
Das ist richtig, da dieser Zeitstempel immer noch nur innerhalb DST (Sommerzeit/Sommerzeit) ist.
Aber nun einer Sekunde auf die Zeitstempel integer hinzufügen und Ausfahrt DST:
$new = $time + 1;
echo $new . ' - ' . date('r', $new);
// 1477789200 - Sun, 30 Oct 2016 02:00:00 +0100
Hooray! PHP sieht, dass es eine Sekunde später keine Sommerzeit mehr gibt und eine richtige Zeitkette anzeigt.
Aber was, wenn wir nicht eine Sekunde auf die Zeitstempel integer hinzugefügt haben, aber wir benutzten strtotime()
, dass eine Sekunde hinzuzufügen:
$new = strtotime('+1 second', $time);
echo $new . ' - ' . date('r', $new);
// 1477792800 - Sun, 30 Oct 2016 03:00:00 +0100
Huch! Wir sind nur um mehr als eine Stunde statt um eine Sekunde vorgegangen. Und es ist nicht einmal wichtig, wenn Sie eine Sekunde, eine Stunde, einen Tag oder ein Jahr hinzufügen, Sie werden immer eine zusätzliche Stunde damit bekommen. Selbst wenn Sie mehrere Jahre hinzufügen, erhalten Sie nur eine zusätzliche Stunde, was komisch ist, weil wir die Sommerzeit jedes Jahr eingeben und wieder verlassen, aber Sie erhalten nur eine zusätzliche Stunde unabhängig davon, wie viele Jahre Sie hinzufügen
Aber wir Ausfahrt Sommerzeit im Oktober und subtrahieren Sie eine Sekunde, alles geht gut ...
Aber dann wieder. Wenn wir im März waren und wir gerade die Sommerzeit eingegeben haben und wir eine Sekunde subtrahieren, beobachten wir das genau umgekehrt.
Warten Sie, was?! Damit ... ?
echo strtotime('+ 1 second - 1 second', 1477789199); // echoes 1477792799
Whoa ...
Für mich klingt das wie ein Bug. Oder ist das "mit Absicht"? Weiß jemand überhaupt, ob das irgendwo dokumentiert ist oder ob es gemeldet werden muss?
Hoppla. Wenn ich den PHP-Bug-Pool vor dem Posten überprüft hätte, hätte ich festgestellt, dass 2012 ein ähnliches Problem ohne Follow-up gemeldet wird: https://bugs.php.net/bug.php?id=62185 –
Aus dem [doc] (http://php.net/manual/en/function.strtotime.php): 'Diese Funktion für mathematische Operationen ist nicht ratsam. Es ist besser, DateTime :: add() und DateTime :: sub() in PHP 5.3 und höher oder DateTime :: modify() in PHP 5.2 zu verwenden. ' –
Berichtet unter https://bugs.php.net/bug.php?id=73138 –