In meiner Anwendung versuche ich die verbleibende Zeit bis Mitternacht GMT (UK Zeit) zu berechnen. Im Moment mache ich das:
%Vor%Der Code funktioniert, es scheint jedoch eine Stunde zurück zu sein (mit GMT -1). Im Moment ist es 11:49 Uhr und die Ausgabe ist:
%Vor% Ich habe meine php.ini
überprüft und diese Zeitzone als GMT festgelegt:
Dies wird auch durch Überprüfen von phpinfo()
bestätigt.
Was gibt? Warum verwendet meine Anwendung nicht die richtige Zeitzone?
Ich habe das unter Linux PHP 5.5.5 getestet, wobei Europe/London
als Zeitzone in php.ini
festgelegt wurde. Ich habe die Uhr sogar um vier Stunden zurückgestellt. Der minimale Code, den ich zum Reproduzieren verwendete, war:
Die (korrekte) Ausgabe war:
%Vor%Ich werde nach einem Fehler in PHP oder einem Fehler in den Zeitzonendaten suchen. Um herauszufinden, was wir heute Nacht in London sehen, was ein anderes Programm macht. Epoch Converter sagt mir, das sollte einen Unix-Timestamp von 1382828400 haben. Um diesen Zeitstempel zu überprüfen, lief ich in PHP:
%Vor%Es hat auch 1382828400 zurückgegeben. Also, mal sehen, was es zeigen soll ...
%Vor%Die Ausgabe war:
%Vor%Richtig! Also tzdata ist in Ordnung. Schauen wir uns PHP an.
Ich habe Ihren Beispielcode zusammen mit dem date
-Befehl ausgeführt und folgende Ausgabe erhalten:
Das ist natürlich richtig.
Ich denke, an dieser Stelle haben wir Fehler sowohl in tzdata als auch in PHP ausgeschlossen und müssen uns mit Konfigurationsproblemen und Programmierererwartungen befassen.
Erstens ist Europa / London, wie ich bereits erwähnt habe, nicht UTC, das kein Sommerzeitkonzept hat und sich daher nicht zweimal pro Jahr ändert. Da solche Probleme nicht auftreten, empfiehlt es sich, Server unabhängig von der Zeitzone, in der sich ihre Benutzer befinden, auf UTC auszuführen. Außerdem empfiehlt es sich, dass Programme UTC intern verwenden und dann in lokale Zeitzonen umwandeln Anzeige und nur Benutzereingabe.
Meine beste Vermutung ist, dass auf dem Server, auf dem PHP läuft, eigentlich UTC und nicht Europe / London als Standardzeitzone eingestellt ist. Dies ist die einzige Konfiguration, in der ich Ihr Problem reproduzieren konnte. Die Ergebnisse dieses Tests waren:
%Vor% In Zukunft sollten Sie in UTC (und mit Unix-Zeitstempeln) arbeiten, wann immer es praktisch ist, und so früh wie möglich in die lokale Zeit umwandeln, so wie Sie es können. Ein Kantenfall wie dieser, bei dem die Sommerzeit kurz vor dem Ende steht, kann eine Ausnahme sein, aber Sie müssen besonders vorsichtig sein, um sicherzustellen, dass jedes neue DateTime
-Objekt die richtige Zeitzone aufweist, wenn Sie es konstruieren achte auch darauf, dass sie solche Probleme haben werden.
Siehe auch die umfangreichen und informativen Empfehlungen für die Sommerzeit und die Zeitzone
Schließlich, um Ihren Code zu "reparieren", machen wir das:
%Vor%