Wie erhalte ich die aktuelle Zeitzone von MySQL?


217

Weiß jemand, ob es in MySQL eine solche Funktion gibt?

AKTUALISIEREN

Dies gibt keine gültigen Informationen aus:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Oder vielleicht kann MySQL selbst nicht genau wissen, was time_zoneverwendet wird, das ist in Ordnung, wir können PHPhier einbeziehen , solange ich gültige Informationen erhalten kann, die nicht wie SYSTEM...


3
"Wir können hier PHP einbeziehen" - und würde sich diese PHP-Instanz immer auf demselben Computer wie der MySQL-Server befinden?
VolkerK

Ja, sie werden auf derselben Maschine sein.
user198729

10
Versuchen Sie es @@system_time_zonewie in meiner Antwort unten angegeben.
Andrew

Da die Frage gestellt wurde, wurden weitere Antworten hinzugefügt. Überdenken Sie möglicherweise die akzeptierte Antwort.
Timo Huovinen

1
Obwohl sich der MySQL-Server und PHP auf demselben Server befinden, können sie je nach ihren Einstellungen unterschiedliche Zeitzonen erfassen. Und diese Zeiten können sich von denen Ihres Betriebssystems und von PHP / MySQL unterscheiden.
Bimal Poudel

Antworten:


226

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, SYSTEMwenn 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:00in 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.


5
@ user198729: Es ist nicht bedeutungslos , obwohl es bei weitem nicht so hilfreich ist, wie ich gehofft hatte. Was es bedeutet ist: Fragen Sie das Betriebssystem, MySQL macht sich daran.
TJ Crowder

Nur neugierig, warum müssen wir die Zeitzone selbst einstellen und dann abrufen? Diese Art von Niederlagen hat den Zweck, nicht wahr? Ich meine, ich möchte MySQL nach der Zeitzone fragen, weil ich die Antwort nicht kenne. Vielleicht bin ich verwirrt und habe etwas falsch gemacht. Kann jemand erklären?
Senthil

1
@Senthil Der mySQL- DATETIMETyp enthält keine Zeitzoneninformationen. Daher denke ich, dass die beabsichtigte zugrunde liegende Philosophie hier darin besteht, dass mySQL so zeitzonenblind wie möglich ist - was bedeutet, dass der Benutzer bei einer Zeitzone bleibt, entweder UTC oder der Zeitzone, in der sich der Server befindet, alles in dieser Zone speichert und Konvertierungen auf Anwendungsebene oder mit CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… ) durchführen. Zumindest habe ich so immer verstanden, wie es funktionieren soll, wenn ich mir die spärlichen Optionen angesehen habe, die mySQL in diesem Bereich bietet.
Pekka

Danke, aber das ist noch nicht gelöst. Wie bekomme ich die tz-Informationen durch das Ergebnis von now()in PHP?
user198729

Ich stimme dem Teil "Beim Speichern des Zeitstempels an einer Zeitzone festhalten" voll und ganz zu. Aber dies-> "..oder die Zeitzone, in der sich der Server befindet .." Wie finden Sie das heraus? Angenommen, Sie haben alle Zeitstempelwerte als UTC gespeichert. Ihr Server befindet sich jedoch in einer anderen Zeitzone und Sie möchten die Zeitstempelwerte entsprechend dieser Zeitzone anzeigen . Woher wissen Sie also, in welcher Zeitzone sich Ihr Server befindet? Nur dann können Sie einen Wert an CONVERT_TZ () übergeben, um ihn richtig zu konvertieren?
Senthil

196

Die folgende Abfrage gibt die Zeitzone der aktuellen Sitzung zurück.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));

6
Dies ist wirklich die richtige Antwort, da sie zeigt, dass 'SYSTEM' bei der Konvertierung als Zeitzone erkannt wird, sodass es völlig ausreichend ist, z. B. NOW () in eine beliebige Zeitzone zu konvertieren.
Nilskp

5
Danke, damit konnte ich das gewünschte Format bekommen:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
Jordanbtucker

97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)ist einfacher.
Jakub Vrána

3
Oder SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);um den Unterschied in Sekunden zu bekommen.
Philfreo

106

Einfach SELECT @@system_time_zone;

Rückgabe PST(oder was auch immer für Ihr System relevant ist).

Wenn Sie versuchen, die Sitzungszeitzone zu bestimmen, können Sie folgende Abfrage verwenden:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Dadurch wird die Sitzungszeitzone zurückgegeben, wenn sie von der Systemzeitzone abweicht.


6
Der einzige Nachteil ist, dass, wenn sich die Zeitzone aufgrund von Änderungen der Sommerzeit ändert, immer noch die Zeitzone gemeldet wird, an die zum Zeitpunkt des Starts des Servers "erinnert" wurde (siehe MySQL-Fehler 9518
Mark

72

Wie Jakub Vrána (Der Ersteller oder Administrator und NotORM ) in den Kommentaren erwähnt, um den aktuell verwendeten Zeitzonenversatz auszuwählen TIME:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Es wird zurückkehren: 02:00:00 Wenn Ihre Zeitzone für dieses Datum +2: 00 ist

Ich habe hier ein Cheatsheet erstellt: Sollte die Zeitzone von MySQL auf UTC eingestellt sein?


Oder SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);um den Unterschied in Sekunden zu bekommen.
Philfreo

Add-On zu @philfreo - Beachten Sie, dass die Parameter in TIMESTAMPDIFF im Vergleich zu TIMEDIFF umgekehrt werden sollten. Um das in dieser Antwort gegebene Beispiel zu nehmen, würde, wenn TIMEDIFF zurückkehrt 02:00:00, das entsprechende TIMESTAMPDIFF zurückkehren, -2wenn die Einheit HOUR ist, -120wenn die Einheit MINUTE ist usw. Um das Vorzeichen zu erhalten, das der Zeitzone entspricht, tauschen Sie die Parameter aus: Gibt SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())die erwartete 120Zeitzone zurück +2: 00. Der Grund für die Angabe von Minuten ist, dass es einige Zeitzonen gibt, die 30 oder 45 Minuten versetzt sind, siehe en.wikipedia.org/wiki/Time_zone
ToolmakerSteve

1
Dies ist eine viel bessere Antwort als die akzeptierte Antwort, da sie die Frage direkt beantwortet und eine Lösung anstelle nur der Theorie liefert.
Supersan

10

Um die aktuelle Zeitzone des MySQL zu erhalten, können Sie folgende Schritte ausführen:

 1. SELECT @@system_time_zone;   //from this you can get the system timezone 
 2. SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) //This will give you time zone if system timezone is different from global timezone

Wenn Sie nun die MySQL-Zeitzone ändern möchten, dann:

 1. SET GLOBAL time_zone = '+00:00'   //this will set mysql timezone in UTC
 2. SET @@session.time_zone = "+00:00";  //by this you can chnage the timezone only for your particular session 

6
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Dadurch wird die Zeitzone als Ganzzahl (z. B. :) zurückgegeben -6, wobei positive oder negative Zeiten behandelt werden (hier kommt der EXTRACTPunkt ins Spiel: Die HOURFunktion allein gibt negative Zeitzonen als positiv zurück).


6

Zu jedem kommen, um Zeitzone von MySQL DB zu finden.

Mit dieser Abfrage können Sie die aktuelle Zeitzone abrufen:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

4

Der in der Beschreibung erwähnte Befehl gibt "SYSTEM" zurück, was angibt, dass die Zeitzone des Servers benötigt wird. Was für unsere Anfrage nicht nützlich ist.

Die folgende Abfrage hilft beim Verständnis der Zeitzone

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

Die obige Abfrage gibt Ihnen das Zeitintervall in Bezug auf die koordinierte Weltzeit (UTC). So können Sie die Zeitzone einfach analysieren. Wenn die Datenbankzeitzone IST ist, wird 5:30 ausgegeben

UTC_TIMESTAMP

In MySQL gibt UTC_TIMESTAMP das aktuelle UTC-Datum und die aktuelle UTC-Uhrzeit als Wert im Format 'JJJJ-MM-TT HH: MM: SS' oder JJJJMMTTHHMMSS.uuuuuu zurück, abhängig von der Verwendung der Funktion, dh in einer Zeichenfolge oder einem numerischen Kontext.

JETZT()

JETZT () Funktion. MySQL NOW () gibt den Wert des aktuellen Datums und der aktuellen Uhrzeit im Format 'JJJJ-MM-TT HH: MM: SS' oder im Format JJJJMMTTHHMMSS.uuuuuu zurück, je nach Kontext (numerisch oder Zeichenfolge) der Funktion. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () sind Synonyme für NOW ().


2

Überprüfen Sie die MySQL Server-Zeitzonenunterstützung und die system_time_zoneSystemvariable. Hilft das?


@user können Sie bitte in Ihrer Frage angeben, nach welchen Informationen Sie genau suchen (Zeitzone des Servers? Zeitzone des Clients?) und welche Tools Ihnen zur Verfügung stehen? Sie erwähnen PHP. Können Sie auf die Befehlszeile zugreifen?
Pekka

5
@user auch, ich finde, dass Sie als ein bisschen wie ein Schwanz rüberkommen, der Antworten von Leuten abstimmt, die versuchen, hilfreich zu sein, und nicht gerade falsch. Ich habe nichts gegen die Abstimmung oder den Verlust von Punkten, aber Ihre Haltung ist nicht gerade ermutigend, weiter nach einer Lösung zu suchen.
Pekka

3
@user Wie gesagt, Ihre Einstellung motiviert mich nicht, nach weiteren Antworten für Sie zu suchen, insbesondere angesichts der mageren Informationen, die Sie bereitstellen. Es tut uns leid.
Pekka

3
@ user198729: Wow, verliere die Einstellung. Pekka ist der Typ, der den Leuten wirklich hilft. Wenn Höflichkeit allein nicht ausreicht, um Sie zu motivieren, versuchen Sie es mit Eigennutz.
TJ Crowder

2
Nur meine Gedanken: Ich hätte mich nicht beleidigt, wenn der Benutzer meinem Beitrag dasselbe getan hätte. Ich meine, Termindruck oder Frustration fügen den Leuten einige Ecken und Kanten hinzu, aber ich denke, wir sollten es bis zu einem gewissen Grad zulassen. Vielleicht bin ich zu verzeihend: |
Senthil

1

Mein PHP-Framework verwendet

SET LOCAL time_zone='Whatever'

Ein nach dem Verbinden, wobei 'Whatever' == date_default_timezone_get ()

Nicht meine Lösung, aber das stellt sicher SYSTEM Zeitzone des MySQL-Servers immer dieselbe ist wie die von PHP

Also, ja, PHP ist stark involviert und kann es beeinflussen


1

Um die aktuelle Zeit gemäß Ihrer Zeitzone zu erhalten, können Sie Folgendes verwenden (in meinem Fall '+5: 30')

Wählen Sie DATE_FORMAT (convert_tz (now (), @@ session.time_zone, '+ 05:30'), '% Y-% m-% d').


0

Sie müssen mysqld nur neu starten, nachdem Sie die Zeitzone des Systems geändert haben.

Die globale Zeitzone von MySQL benötigt die Zeitzone von System. Wenn Sie ein solches Systemattribut ändern, benötigen Sie lediglich einen Neustart von Mysqld.


Nach dem Ändern der Zeitzone unter dem Betriebssystem verwenden MySQL-Einfügungen die neue Zeitzone, wählen Sie jedoch now () aus. und wählen Sie current_timestamp aus; Befehle verwenden weiterhin die alte Zeitzone. Um all dies zu synchronisieren, muss der MySQL-Dienst neu gestartet werden.
Manoj Kumar G

0

Fügen Sie einen Dummy-Datensatz in eine Ihrer Datenbanken mit einem Zeitstempel ein. Wählen Sie diesen Datensatz aus und erhalten Sie den Wert des Zeitstempels. Löschen Sie diesen Datensatz. Ruft mit Sicherheit die Zeitzone ab, die der Server zum Schreiben von Daten verwendet, und ignoriert PHP-Zeitzonen.


0

Sie können Folgendes versuchen:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

Hier können Sie Ihren Zeitunterschied als Sekunden angeben


1
Sie sollten keine Offsets addieren und subtrahieren. mit Tageslicht, das Regeln usw. sagt, ist es ein Minenfeld
eweb

0

Verwenden LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')Sie diese Option, um einen Wert im Zeitzonenformat von MySQL abzurufen, mit dem Sie bequem arbeiten können CONVERT_TZ(). Beachten Sie, dass der Zeitzonenversatz, den Sie erhalten, nur zu dem Zeitpunkt gültig ist, zu dem der Ausdruck ausgewertet wird, da sich der Versatz im Laufe der Zeit ändern kann, wenn Sie Sommerzeit haben. Der Ausdruck ist jedoch nützlich NOW(), um den Versatz mit der Ortszeit zu speichern, wodurch eindeutig wird, welche NOW()Ausbeuten erzielt werden. (Springt in DST-Zeitzonen NOW()einmal im Jahr eine Stunde zurück und weist daher einige doppelte Werte für bestimmte Zeitpunkte auf.)


0

Es kann sein

select timediff(current_time(),utc_time())

Auf diese Weise erhalten Sie den Zeitzonenwert nicht direkt.

@@global.time_zonekann nicht verwendet werden, da es sich um eine Variable handelt und den Wert zurückgibt 'SYSTEM'.

Wenn Sie Ihre Abfrage in einer Sitzung mit einer geänderten Zeitzone verwenden müssen session SET TIME_ZONE =, erhalten Sie diese mit @@session.time_zone. Wenn Sie abfragen @@global.time_zone, erhalten Sie 'SYSTEM'.

Wenn Sie es datediffmit date_suboder timediffmit now()und versuchen , werden utc_time()Sie wahrscheinlich auf Konvertierungsprobleme stoßen.

Aber die oben vorgeschlagenen Dinge werden wahrscheinlich zumindest mit einigen Serverversionen funktionieren. Meine Version ist 5.5.43-37 und ist eine gehostete Lösung.


Dies beantwortet die Frage nicht eindeutig. Vielleicht können Sie es bearbeiten , um sich auf die gestellte Frage zu konzentrieren.
Mogsdad

-3

Versuchen Sie es mit dem folgenden Code:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.