Hugo Egon Balder: LÖSUNG UND ZUSAMMENFASSUNG (Frage ist somit beantwortet!)

Beitrag lesen

Hallo Dedlfix!

Deswegen sagte ich, dass du für diesen Weg nicht 'UTC' sondern '+0:00' verwenden solltest.

Das hat mein Hirn beim Lesen wohl als unwichtig eingestuft, weil das "soll" ursprünglich ein "kann" war. Und _genau das_ war jetzt die Lösung!

Bei UTC kannst du im Gegensatz zu den Lokalzeiten mit Sommerzeitumschaltung die Zone als Zahl setzen, weil diese immer gleich ist.

Gute Info!

Wenn das Umstellen der MySQL-Zeit auf die UTC nicht klappt, dann wird diese Zeit als Lokalzeit interpretiert und UNIX_TIMESTAMP() erzeugt den Timestamp von 6:43 UTC. Den rechnest du mit PHPs Lokalzeit dann wieder zwei Stunden hoch.

Das erklärt natürlich, wieso es _so aussieht_, als wäre nichts mit dem gespeicherten Zeitpunkt geschehen.

Danke, lieber Dedlfix, für 1 Woche Geduld mit mir! Ich habe mich bemüht, dem SELF Prinzip folgend so viel als möglich nachzuschlagen, auszuprobieren und Deine Ratschläge zu befolgen. Und nach 7 Tagen hat sich das nun endlich bezahlt gemacht und ich habe eine Antwort/Lösung für meinen ursprünglichen Frageansatz. Danke für Deine Hilfe!

Mfg

Hugo Egon Balder

Und sollte irgendwann jemand nach dieser Lösung suchen und diesen Thread im Archiv finden, hier eine kurze Zusammenfassung:

Unabhängig von der eingestellten Lokalzeit des Servers sollten Timestamps standardisiert _immer_ in UTC gespeichert werden.

Mit anderen Worten: Sämtliche Zeitstempel in der Datenbank sind _immer_ UTC Zeitangaben. *)

Damit die Datenbank das auch weiß, wird es ihr gleich nach dem Verbindungsaufbau gemeinsam mit der Kodierungsinformation mitgeteilt. Die Verbindung zur DB mit mysqli sieht also so aus:

$db=@new mysql('mysql5.example.com','db_foo','password','db_foo');  
$db->set_charset('utf8');  
// Auch wenn die Zeitzonen-Namen-Tabelle des Servers nicht gefüllt ist - '+0:00' versteht er in jedem Fall als UTC:  
$db->query("SET time_zone='+0:00'");

Werden nun die gewünschten UTC-Timestamps per mysqli mit einem INSERT eingefügt, dann ist es _in diesem Fall_ egal, ob man als VALUE ein NOW() oder ein UTC_TIMESTAMP() verwendet, da durch die vorhergehende Festlegung auf UTC beide Werte gleich sind.

Bei der Ausgabe des Zeitstempels lässt man sich den Timestamp gleich direkt von SQL in einen Unix-Timestamp umwandeln:

SELECT UNIX_TIMESTAMP(spaltenname_des_timestamps) AS unixstempel [...]

Nachdem der als "unixstempel" ankommende Wert wird nun in der Variablen $unix gespeichert (Hier nur zur besseren Übersicht! Diesen Zwischenschritt kann man natürlich sparen und das Abfrageresult direkt weiterverarbeiten!) und muss nur noch von php in eine vorher definierte Zeitzone umgerechnet werden:

date_default_timezone_set('Europe/Berlin');  
// Dann kommt der Wert aus der DB.  
// Und dann die Verarbeitung:  
$datum=date('Y-m-d H:i:s',$unix);

Das bedeutet nun:

Wird um 15 Uhr mitteleuropäischer Sommerzeit ein Timestamp gespeichert, dann landet er als 13 Uhr in der DB. Stellt man bei der ausgebenden php-Ressource die Zeitzone auf 'Europe/Berlin', dann wird der Zeitpunkt wieder als 15 Uhr ausgegeben.

Der große Vorteil: Abgesehen davon, dass die gespeicherten Zeiten immer standardisiert UTC sind und man somit nie überlegen muss, auf welche Zeitzone etwas bezogen ist, könnte man nun für zB. die griechische Ausgabe der selben Website nur durch das einfache Setzen eines date_default_timezone_set('Europe/Berlin'); für die Besucher die selben Zeitpunkte in griechischer Zeitzone anzeigen.

*) Einzige Voraussetzung: Der Server muss natürlich den UTC-Bezug richtig konfiguriert haben!