Aus dem Handbuch ( Abschnitt 9.6 ):
Die aktuellen Werte der globalen und kundenspezifischen Zeitzonen können folgendermaßen abgerufen werden:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Bearbeiten Das Obige wird zurückgegeben, SYSTEM
wenn MySQL so eingestellt ist, dass es der Zeitzone des Systems entspricht, was weniger hilfreich ist. Da Sie PHP verwenden und die Antwort von MySQL lautet SYSTEM
, können Sie das System fragen, über welche Zeitzone es verwendet date_default_timezone_get
. (Natürlich, wie VolkerK hervorhob, läuft PHP möglicherweise auf einem anderen Server, aber unter den Voraussetzungen wird davon ausgegangen, dass der Webserver und der DB-Server, mit dem er spricht, auf [wenn nicht tatsächlich in ] derselben Zeitzone eingestellt sind, keine großer Sprung.) Aber Vorsicht, dass Sie (wie bei MySQL) die Zeitzone einstellen können, die PHP verwendet (date_default_timezone_set
), was bedeutet, dass möglicherweise ein anderer Wert gemeldet wird als vom Betriebssystem verwendet. Wenn Sie die Kontrolle über den PHP-Code haben, sollten Sie wissen, ob Sie das tun, und in Ordnung sein.
Die ganze Frage, welche Zeitzone der MySQL-Server verwendet, kann jedoch eine Tangente sein, da die Frage, in welcher Zeitzone er sich befindet, absolut nichts über die Daten in der Datenbank aussagt. Lesen Sie weiter für Details:
Weitere Diskussion :
Wenn Sie die Kontrolle über den Server haben, können Sie natürlich sicherstellen, dass die Zeitzone eine bekannte Größe ist. Wenn Sie nicht die Kontrolle über den Server haben, können Sie die von Ihrer Verbindung verwendete Zeitzone folgendermaßen einstellen :
set time_zone = '+00:00';
Dadurch wird die Zeitzone auf GMT gesetzt, sodass bei weiteren Vorgängen (wie z. B. now()
) GMT verwendet wird.
Beachten Sie jedoch, dass Zeit- und Datumswerte nicht mit Zeitzoneninformationen in MySQL gespeichert werden:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
So wissen die Zeitzone des Servers ist nur wichtig , in Bezug auf die Funktionen, die die Zeit jetzt, wie erhalten now()
, unix_timestamp()
usw .; Es sagt nichts darüber aus, welche Zeitzone die Daten in den Datenbankdaten verwenden. Sie können davon ausgehen, dass sie in der Zeitzone des Servers geschrieben wurden, aber diese Annahme ist möglicherweise fehlerhaft. Um die Zeitzone von Daten oder Zeiten zu kennen, die in den Daten gespeichert sind, müssen Sie sicherstellen, dass sie mit Zeitzoneninformationen gespeichert sind oder (wie ich) sicherstellen, dass sie immer in GMT sind.
Warum ist die Annahme, dass die Daten mit der Zeitzone des Servers geschrieben wurden, fehlerhaft? Zum einen wurden die Daten möglicherweise über eine Verbindung geschrieben, die eine andere Zeitzone festlegt. Die Datenbank wurde möglicherweise von einem Server auf einen anderen verschoben, wobei sich die Server in unterschiedlichen Zeitzonen befanden (ich bin darauf gestoßen, als ich eine Datenbank geerbt habe, die von Texas nach Kalifornien verschoben wurde). Aber selbst wenn die Daten mit ihrer aktuellen Zeitzone auf den Server geschrieben werden, sind sie immer noch nicht eindeutig. Letztes Jahr wurde in den USA die Sommerzeit am 1. November um 2:00 Uhr morgens ausgeschaltet. Angenommen, mein Server befindet sich in Kalifornien und verwendet die pazifische Zeitzone. Ich habe den Wert2009-11-01 01:30:00
in der Datenbank. Wann war es? War das 1:30 Uhr am 1. November PDT oder 1:30 Uhr am 1. November PST (eine Stunde später)? Sie haben absolut keine Möglichkeit zu wissen. Moral: Speichern Sie Datums- und Uhrzeitangaben immer in GMT (ohne Sommerzeit) und konvertieren Sie sie bei Bedarf in die gewünschte Zeitzone.