Hugo Egon Balder: Richtiges Datensatz-Updatedatum in einer SQL DB

Beitrag lesen

Hallo Dedlfix!

Ich habe mich gestern noch bis in die Nacht hineien stundenlang mit dem Thema beschäftigt und sämtliche Variationen immer wieder durchgetestet, ich komme einfach nicht weiter.

Soweit ich weiß, geht das mit einem Statement SET time_zone = timezone.

Das war leider die falsche Syntax. Es kam eine Fehlermeldung. Ich hab dann Gottseidank eine Seite gefunden, wo geschrieben stand, wie ich das richtig zu formulieren habe. Also es wird nach dem $db->set_charset('utf8'); noch zusätzlich ein $db->query("set time_zone='+02:00'"); gesetzt. (Dann kommt keine Fehlermeldung mehr.)

Allerdings hat das leider auch absolut _Null_ Auswirkung auf die Speicherung und die Ausgabe der Timestamps. Egal, ob ich da jetzt als Zeitzone ein 'Europe/Athens', ein 'Europe/Berlin' ... ein '-02:00' oder ein '+04:00' setze - es veränder absolut _nichts_ am Geschehen.

Und wäre das dann so, dass wenn ein Zeitpunkt als 14:00 UTC gespeichrt ist und ich hier zB. Athen als Zeitzone nehme, dann beim Abruf ein 17:00 ausgegeben wird?
So ist das, zumindest zur Sommerzeit. So funktioniert der Unix-Timestamp, so funktioniert der TIMESTAMP unter MySQL.

Leider ist dem nicht so!

In der ersten TS Spalte, das ist die, die automatisch bei der Speicherung eines neuen Datensatzes den momentanen Zeitpunkt speichert, steht _immer_ die aktuelle mitteleuropäische Sommerzeit.

In der zweiten TS Spalte, steht bei Speicherung mit einem NOW() im Query _immer_ die aktuelle mitteleuropäische Sommerzeit und mit einem UTC_TIMESTAMP() im Query _immer_ die UTC Zeit. (Wobei letzteres das Einzige ist, das so geschieht, wie von mir erwartet.)

Und wie gesagt, die gespeicherten und ausgegeben Werte sind _immer_ so wie in den letzten 2 Absätzen beschrieben. Unabhängig davon, ob ich nach dem Verbindungsaufbau eine Zeitzone festlege oder nicht und unabhängig davon, was als Zeitzone festgelegt wird. [Mit Ausgabe meine ich nicht, was ich sehe, wenn ich mir den Tabelleninhalt in phpMyAdmin ansehe - dort steht das selbe übrigens, sondern wirklich das, was ich mir mit php/mysqli über den Browser ausgeben lasse!]

Ich bin also nicht einen Schritt weiter. :-(

Also wenn ich mit einem UTC_TIMESTAMP() im Query erreiche, dass ein aktueller UTC TS gespeichert wird, ist das ja eh gut. Dann stelle ich den Automatismus in der ersten TS Spalte ab, speichere bei beiden Spalten mit UTC_TIMESTAMP() und habe somit sowohl in meiner 'Created', als auch in meiner 'Modified' Spalte immer die UTC Zeit stehen.

Was mir immer noch fehlt ist jetzt die Lösung, wie dieser UTC TS bei Abruf einer Ressource als jene Zeit ausgegeben wird, die zu diesem Zeitpunkt in zB. Berlin oder zB. Athen gewesen ist.

Mir ist natürlich klar, dass ich mir den TS von php zerlegen lassen könnte und vor der Ausgabe manuell eine bestimmte Stundenzahl addiere oder subtrahiere. Nur würde das erstens die Sommerzeit nicht berücksichtigen und zweitens kann ich einfach nicht glauben, dass das der korrekte bzw. simpleste Weg ist. Es _muss_ doch eine Möglichkeit geben, dass mit einer kleinen Code-Veränderung der UTC gespeicherte Zeitpunkt als Zeitpunkt einer Zeitzone seiner Wahl korrekt ausgegeben wird.

Ich weiß echt nicht mehr weiter jetzt.

MfG

Hugo Egon Balder

PS: Was ich natürlich _nicht_ weiß, ist, ob das $db->query("set time_zone='+02:00'"); auch wirklich der richtige Weg zur Festlegung einer Zeitzone ist. Es wird zumindest, wie geschrieben, keine Fehlermeldung oder Warnung ausgegeben.