Wie stelle ich die Zeitzone von MySQL ein?

339

Auf einem Server, wenn ich laufe:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 16:54:29 |
+---------------------+
1 row in set (0.00 sec)

Auf einem anderen Server:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
Oh mein Gott
quelle
Hier gibt es nicht nur einen Zeitzonenunterschied, sondern auch eine nicht so unbedeutende Zeitverschiebung: "Sprechen Sie mit Ihrem DBA darüber ntp- und sehen Sie, was für Sie richtig ist!"
colm.anseo
@ colm.anseo Beruhige dich, es ist wahrscheinlich der Unterschied zwischen dem Ausführen der Abfragen
HosseyNJF
1
@ HosseyNJF um 7 Minuten? Kaffeepause zwischen Vergleichen?
colm.anseo

Antworten:

524

Ich dachte, das könnte nützlich sein:

Es gibt drei Stellen, an denen die Zeitzone in MySQL festgelegt werden kann:

In der Datei "my.cnf" im Abschnitt [mysqld]

default-time-zone='+00:00'

@@ global.time_zone Variable

Um zu sehen, auf welchen Wert sie eingestellt sind:

SELECT @@global.time_zone;

Verwenden Sie einen der folgenden Werte, um einen Wert festzulegen:

SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';

(Die Verwendung benannter Zeitzonen wie "Europa / Helsinki" bedeutet, dass eine Zeitzonentabelle ordnungsgemäß ausgefüllt sein muss.)

Denken Sie daran, dass dies +02:00ein Versatz ist. Europe/Berlinist eine Zeitzone (mit zwei Offsets) und CESTeine Uhrzeit, die einem bestimmten Offset entspricht.

@@ session.time_zone Variable

SELECT @@session.time_zone;

Um es einzustellen, verwenden Sie eine der folgenden Optionen:

SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";

Beide geben möglicherweise SYSTEM zurück, was bedeutet, dass sie die in my.cnf festgelegte Zeitzone verwenden.

Damit Zeitzonennamen funktionieren, müssen Sie Ihre Zeitzoneninformationstabellen einrichten, die ausgefüllt werden müssen: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Ich erwähne auch, wie diese Tabellen in dieser Antwort ausgefüllt werden .

Um den aktuellen Zeitzonenversatz als zu erhalten TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Es wird 02:00:00 zurückgegeben, wenn Ihre Zeitzone +2: 00 ist.

So rufen Sie den aktuellen UNIX-Zeitstempel ab:

SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());

So rufen Sie die Zeitstempelspalte als UNIX-Zeitstempel ab

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

So rufen Sie eine UTC-Datums- / Uhrzeitspalte als UNIX-Zeitstempel ab

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`

Hinweis: Durch Ändern der Zeitzone wird die gespeicherte Datums- oder Zeitstempel nicht geändert , es wird jedoch eine andere Datums- / Uhrzeitangabe für vorhandene Zeitstempelspalten angezeigt, da diese intern als UTC-Zeitstempel gespeichert und in der aktuellen MySQL-Zeitzone extern angezeigt werden.

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

Timo Huovinen
quelle
3
+00:00ist keine Zeitzone, sondern ein Zeitversatz. Was passiert mit DST? Bleibt es das ganze Jahr über bei +0?
Mpen
1
@Mark Ich bin mir nicht sicher, die Dokumente sagen, dass Sie beim Einstellen time_zone="+00:00"der Zeitzone einen Versatz von UTC festlegen, da sich der eingestellte Wert nie ändert und UTC nicht der Sommerzeit folgt. Ich kann davon ausgehen, dass er das ganze Jahr über gleich bleibt.
Timo Huovinen
1
@TimoHuovinen Entschuldigung, ich meinte, das +00:00 sieht aus wie ein Offset. Es ist also seltsam, dass MySQL dies gewählt hat, um UTC darzustellen, anstatt nur die Zeichenfolge "UTC" selbst zu verwenden. Danke für die Information.
Mpen
1
Ich habe +00: 00 eingestellt, aber ich erhalte diesen Fehler: Fehler: Gefundene Option ohne vorhergehende Gruppe in der Konfigurationsdatei: /etc/my.cnf
János
5
In Win7 ist der Pfad zur MySQL-EinstellungsdateiC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca
82

Für alle, die dieses Problem noch haben:

value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"

Hat für mich gearbeitet. Einfach ?serverTimezone=UTCam Ende anhängen .

Noel Murphy
quelle
Wenn meine Zeitzone UTC + 7 ist, wie kann ich das in der Verbindungszeichenfolge angeben? Ich habe versucht, "? ServerTimezone = UTC + 7" anzuhängen, aber es funktioniert nicht.
Chiến Nghê
1
Die Frage betraf nicht JDBC, sondern MySQL selbst.
Luiz
2
@ ChiếnNghê: Sie sollten Asia/Ho_Chi_Minhanstelle von UTCBTW verwenden, die Frage ist über das Ändern der MySQL-Zeitzone. Schauen Sie sich also bitte die Antwort von @Timo an. Wenn Sie Probleme mit dem MySQL-Docker haben, fügen Sie eine TZ-Umgebung hinzu, und es sollte funktionieren.
Liem Le
2
Dies informiert JDBC nur über die Server-Zeitzone, ändert sie jedoch nicht . Um die Sitzungszeitzone festzulegen, überprüfen Sie die Antworten, dieSET time_zone=...
Nikola Mihajlović
Ich habe einen CDT-Fehler erhalten, der dies jedoch für mich behoben hat.
Akexis
58

Wenn Sie den Zeitzonenserver für MySQL oder PHP konfigurieren können:

Merken:

  1. Zeitzonensystem ändern. Beispiel für Ubuntu:

    $ sudo dpkg-reconfigure tzdata
  2. Starten Sie den Server neu oder starten Sie Apache 2 und MySQL neu:

    /etc/init.d/mysql restart
Jane
quelle
2
Vielleicht ist dieser Ansatz nicht der richtige. Denken Sie an die Situation, einen Server mit UTC zu haben, aber Ihre Anwendung liefert Daten an ein Land unter UTC -0600. Die Zeitzone für MySQL anzupassen, könnte viel besser sein.
ivanleoncz
1
Besonders wenn Sie in einem Bereich arbeiten, der mehrere Zeitzonen abdeckt.
Alexis Wilke
57

Gehen Sie wie folgt vor, um es für die aktuelle Sitzung festzulegen:

SET time_zone = timezonename;
James Skidmore
quelle
14
SELECT @@ session.time_zone;
James Skidmore
1
Ich versuche, einige Fehler auf meinem System zu beheben, und ich muss meine Zeitzone auf UTC und nicht auf GMT setzen. Wissen Sie, ob ich auf '-0: 00' oder '+00: 00' gesetzt habe, dass dies eine UTC-Annotation oder eine GMT-Annotation ist? Ich finde diese spezifischen Informationen NICHT. Prost!
Rafa.ferreira
@ Castanho, ich bin mir ziemlich sicher, dass beides gut funktionieren wird. Lesen
James Skidmore
Der Wert für die Zeitzone kann mit dem in PHP festgelegten Wert identisch sein, z SET time_zone = 'America/Boise'. Danke für die Antwort, James Skidmore!
Adam F
1
@the_nuts ja, die SET time_zone = 'UTC';Einstellung geht beim Neustart des Servers verloren
Timo Huovinen
48

Führen Sie dies einfach auf Ihrem MySQL-Server aus:

SET GLOBAL time_zone = '+8:00';

Wobei +8: 00 Ihre Zeitzone ist.

Rico Chan
quelle
14
Beachten Sie, dass dies nur vorübergehend ist, bis Sie Mysql
rubo77
In seltenen Fällen verfügt man über Superuser-Berechtigungen, wenn eine Verbindung zu einer Datenbank hergestellt wird. Die Einstellung @@session.time_zonewie in anderen Antworten beschrieben ist eine viel bessere Route.
colm.anseo
16

Diese Arbeit für mich für einen Standort in Indien:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Swapnil Bijwe
quelle
Sie müssen dies als Abfrage auf MySQL ausführen oder unter my.conf mit der folgenden Syntax schreiben: default-time-zone = '+05: 30'
Swapnil Bijwe
11

Denken Sie daran, dass 'Land / Zone' manchmal nicht funktioniert ... Dieses Problem ist nicht vom Betriebssystem, der MySQL-Version und der Hardware abhängig - ich habe es seit FreeBSD 4 und Slackware Linux im Jahr 2003 bis heute kennengelernt. MySQL von Version 3 bis zum neuesten Quell-Trunk. Es ist ODD, aber es passiert. Zum Beispiel:

root@Ubuntu# ls -la /usr/share/zoneinfo/US
total 8

drwxr-xr-x  2 root root 4096 Apr 10  2013 .
drwxr-xr-x 22 root root 4096 Apr 10  2013 ..
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Alaska -> ../SystemV/YST9YDT
lrwxrwxrwx  1 root root   21 Jul  8 22:33 Aleutian -> ../posix/America/Adak
lrwxrwxrwx  1 root root   15 Jul  8 22:33 Arizona -> ../SystemV/MST7
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Central -> ../SystemV/CST6CDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Eastern -> ../SystemV/EST5EDT
lrwxrwxrwx  1 root root   37 Jul  8 22:33 East-Indiana -> ../posix/America/Indiana/Indianapolis
lrwxrwxrwx  1 root root   19 Jul  8 22:33 Hawaii -> ../Pacific/Honolulu
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Indiana-Starke -> ../posix/America/Knox_IN
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Michigan -> ../posix/America/Detroit
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Mountain -> ../SystemV/MST7MDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific-New -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   20 Jul  8 22:33 Samoa -> ../Pacific/Pago_Pago
root@Ubuntu#

Und eine solche Aussage soll funktionieren:

SET time_zone='US/Eastern';

Aber Sie haben dieses Problem:

Fehlercode: 1298. Unbekannte oder falsche Zeitzone: 'EUS / Eastern'

Sehen Sie sich den Unterordner in Ihrem Zoneninformationsverzeichnis an und sehen Sie den IST-Dateinamen für Symlink. In diesem Fall ist es EST5EDT. Versuchen Sie stattdessen diese Aussage:

SET time_zone='EST5EDT';

Und es funktioniert tatsächlich so, wie es soll! :) Behalte diesen Trick im Hinterkopf; Ich habe nicht gesehen, dass es in MySQL-Handbüchern und in der offiziellen Dokumentation dokumentiert ist. Das Lesen der entsprechenden Dokumentation ist jedoch ein Muss: Die offizielle Dokumentation zur Zeitzone von MySQL 5.5 - und vergessen Sie nicht, die Zeitzonendaten einfach so auf Ihren Server zu laden (als Root-Benutzer ausführen!):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

Trick Nummer eins - es muss genau unter MySQL-Root-Benutzer gemacht werden. Es kann fehlschlagen oder zu einem nicht funktionierenden Ergebnis führen, selbst wenn der Benutzer vollen Zugriff auf eine MySQL-Datenbank hat - ich habe den Fehler selbst gesehen.

Alexey Vesnin
quelle
Bitte teilen Sie mir Ihren Namen mit - ein und weitere Details - haben Sie einige Arbeitsfälle auf Ubuntu Desktop und Server.
Alexey Vesnin
7

Dies ist eine 10 Jahre alte Frage, aber hier ist, was für mich funktioniert hat. Ich verwende MySQL 8.0 mit Hibernate 5 und SpringBoot 4.

Ich habe die oben akzeptierte Antwort ausprobiert, aber bei mir nicht funktioniert. Was bei mir funktioniert hat, ist Folgendes:

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw

Wenn dies hilft, vergessen Sie nicht, es zu verbessern: D.

Hamza Säbel
quelle
4

Alte Frage mit einem weiteren Vorschlag:

Wenn Sie kürzlich die Zeitzone des Betriebssystems geändert haben, z.

unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime

... MySQL (oder MariaDB) wird es nicht bemerken, bis Sie den Datenbankdienst neu starten:

service mysqld restart

(oder)

service mariadb restart
inanutshellus
quelle
3

Wenn Sie die MySql Workbench verwenden , können Sie dies festlegen, indem Sie die Administratoransicht öffnen und die Registerkarte Erweitert auswählen. Der obere Abschnitt ist "Lokalisierung" und das erste Kontrollkästchen sollte "Standardzeitzone" sein. Aktivieren Sie dieses Kontrollkästchen und geben Sie dann die gewünschte Zeitzone ein, starten Sie den Server neu und Sie sollten bereit sein.

Taylor Lafrinere
quelle
2
Das Problem hängt mit MySQL zusammen, nicht mit einem bestimmten Programm.
Fedorqui 'SO hör auf zu schaden'
3
Fand nichts dergleichen.
Kzqai
1
Nichts dergleichen
Green
Für MySQL Workbench 6.3: Instanz => Optionsdatei => Allgemein => International
paulus
5
[ UPDATE für MySQL Workbench 8.0 ] Wählen Sie "Server" => "Optionsdatei" und klicken Sie auf der Registerkarte "Allgemein" auf den Abschnitt "International" . Das Kontrollkästchen "Standardzeitzone" wird zusammen mit dem zugehörigen Feld angezeigt. So können Sie dort den Standardwert für die Zeitzone festlegen .
informatik01
3

Um herauszufinden, was die Zeitzone ist, können Sie zuerst abfragen

SHOW VARIABLES LIKE '%time_zone%'; 

Ihre Ausgabe sollte wie folgt aussehen

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM

Wenn Sie dann bestätigen möchten, dass Sie sich in einer Zeitzone wie CDT anstelle von EST befinden, können Sie überprüfen, zu welcher Zeit sich Ihre Maschine befindet

SELECT NOW();

Wenn dies nicht die Zeit ist, die Sie möchten, müssen Sie sie ändern ... alles, was Sie tun müssen, ist SET time_zone = timezone_name . Stellen Sie sicher, dass es sich um ein Continent/CityFormat handelt.

Wenn Sie sich auf einem gemeinsam genutzten Server befinden, weil Sie einen Hosting-Dienst haben, lesen Sie bitte diese Antworten zum Ändern der Datei php.ini oder der Datei .htaccess.

Erik Toor
quelle
1
Ich habe es mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Ezuerst versucht und dann gut SET time_zone = timezone_namefunktioniert.
Barakat Turki
1

Sie müssen die Zeitzone Ihres Standorts einrichten.
Gehen Sie also wie folgt vor: Öffnen Sie Ihre MSQLWorkbench und schreiben Sie einen einfachen SQL-Befehl wie diesen.

select now();

Und auch Ihre URL könnte so sein;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
harun ugur
quelle
@LuFFy das ist es, worüber ich mich gewundert habe, also muss für jede Datenbankverbindung die Zeitzone eingestellt werden, WENN wir die Zeitzone des Sitzungsbereichs und nicht die Zeitzone des 'globalen' Bereichs verwenden. Es ist gut, den Sitzungsumfang zu verwenden, wenn die App Benutzer in verschiedenen Zeitzonen haben kann, oder?
Valter Ekholm
1

Um die Standard - Zeitzone setzen MariaDB müssen Sie gehen auf die 50-server.cnf Datei.

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Dann können Sie den folgenden Eintrag in den Abschnitt mysqld eingeben.

default-time-zone='+01:00'

Beispiel:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

### Default timezone ###
default-time-zone='+01:00'

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

Die Änderung muss über die Konfigurationsdatei vorgenommen werden, sonst setzt der MariaDB-Server die MySQL-Tabellen nach einem Neustart zurück!

Lukas Kuntze
quelle
1

Bearbeiten Sie die MySQL-Konfigurationsdatei

sudo nano /etc/mysql/my.cnf

Scrollen Sie und fügen Sie diese unten hinzu. Wechseln Sie in die entsprechende Zeitzone

[mysqld]
default-time-zone = "+00:00"

Starten Sie den Server neu

sudo service mysql restart
Ivan_ug
quelle
0

Unter Windows (IIS) müssen zuerst die MySQL-Zeitzonenbeschreibungstabellen ausgefüllt werden, damit GLOBAL time_zone = 'Europe / Helsinki' (oder was auch immer) gesetzt werden kann.

Ich habe diese von diesem Link heruntergeladen https://dev.mysql.com/downloads/timezones.html

Nachdem ich die heruntergeladene SQL-Abfrage ausgeführt hatte, konnte ich die GLOBAL time_zone festlegen und das Problem beheben, bei dem SELECT NOW (); gab eher GMT als BST zurück.

Stewart Kirkpatrick
quelle
Ich könnte das Zahlenformat "+01: 00" anstelle von "Europa / Stockholm" verwenden, sodass ich die Beschreibungstabellen für time_zone nicht herunterladen musste, denke ich.
Valter Ekholm
0

In meinem Fall bestand die Lösung darin, den Parameter serverTimezone in den erweiterten Einstellungen auf einen geeigneten Wert (MEZ für meine Zeitzone) zu setzen.

Wenn ich IntelliJ verwende, verwende ich das Datenbankmodul. Beim Hinzufügen einer neuen Verbindung zur Datenbank und nach dem Hinzufügen aller relevanten Parameter auf der Registerkarte Allgemein ist ein Fehler auf der Schaltfläche "Verbindung testen" aufgetreten. Die Lösung besteht wiederum darin, den Parameter serverTimezone auf der Registerkarte Erweitert festzulegen.

ognjenkl
quelle
0

Wenn jemand GoDaddy Shared Hosting verwendet, können Sie versuchen, die folgende Lösung zu finden, die für mich funktioniert hat.

Setzen Sie beim Starten der DB-Verbindung den Befehl time_zone in meinem PDO-Objekt, z.

$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->exec("SET time_zone='+05:30';");

Wobei "+05: 30" die TimeZone von Indien ist. Sie können es nach Bedarf ändern.

Nachdem; Alle MySQL-Prozesse in Bezug auf Datum und Uhrzeit werden mit der erforderlichen Zeitzone festgelegt.

Quelle: https://in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

Ashish Pandey
quelle