wake-up-neo.com

Wie stelle ich die Zeitzone von MySQL ein?

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)
284
omg

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

So stellen Sie fest, auf welchen Wert sie festgelegt 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';

(Wenn Sie benannte Zeitzonen wie "Europa/Helsinki" verwenden, muss eine Zeitzonentabelle ordnungsgemäß ausgefüllt sein.)

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

@@ session.time_zone Variable

SELECT @@session.time_zone;

Verwenden Sie eine der folgenden Optionen, um sie festzulegen:

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 Zeitzonen-Namen funktionieren, müssen Sie Ihre Zeitzonen-Informationstabellen 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 diese Antwort gefüllt werden.

So ermitteln Sie den aktuellen Zeitzonenversatz als 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-Datetime-Spalte als UNIX-Zeitstempel ab

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

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

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

459
Timo Huovinen

Für alle, die noch dieses Problem haben:

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

Hat für mich gearbeitet. Fügen Sie am Ende einfach ?serverTimezone=UTC hinzu.

54
Noel Murphy

So legen Sie es für die aktuelle Sitzung fest:

SET time_zone = timezonename;
53
James Skidmore

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

Merken:

  1. Ändern Sie das Zeitzonensystem. Beispiel für Ubuntu:

    $ Sudo dpkg-reconfigure tzdata
    
  2. Starten Sie den Server neu oder Sie können Apache 2 und MySQL neu starten:

    /etc/init.d/mysql restart
    
50
jane

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

SET GLOBAL time_zone = '+8:00';

Wobei +8: 00 Ihre Zeitzone ist.

39
Rico Chan

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";
14
Swapnil Bijwe

Sie können die Standard-Zeitzone des Servers beim Starten angeben, siehe http://dev.mysql.com/doc/refman/5.1/en/server-options.html und speziell den --default-time-zone=timezone Möglichkeit. Sie können die globalen und Sitzungszeitzonen mit überprüfen

SELECT @@global.time_zone, @@session.time_zone;

setzen Sie eines oder beide mit der Anweisung SET, & c; Weitere Informationen finden Sie unter http://dev.mysql.com/doc/refman/5.1/de/time-zone-support.html .

10
Alex Martelli

Denken Sie daran, dass 'Country/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:

[email protected]# 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
[email protected]#

Und so eine Aussage soll funktionieren:

SET time_zone='US/Eastern';

Aber du hast 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 EST5EDT. Dann versuche 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 offiziellen Dokumentationen dokumentiert ist. Aber das Lesen der entsprechenden Dokumentation ist ein Muss: offizielle MySQL 5.5-Dokumentation zur Zeitzone - 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 durchgeführt werden. Es kann fehlschlagen oder ein nicht funktionierendes Ergebnis erzeugen, selbst wenn der Benutzer vollen Zugriff auf eine MySQL-Datenbank hat - ich habe den Fehler selbst gesehen.

9
Alexey Vesnin

Wenn Sie PDO verwenden:

$offset="+10:00";
$db->exec("SET time_zone='".$offset."';");

Wenn Sie MySQLi verwenden:

$db->MySQLi->query("SET time_zone='".$offset."';");

Weitere Informationen zum Formatieren des Offsets finden Sie hier: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/

6
MeKoo Solutions

Antike Frage mit einem weiteren Vorschlag:

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

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

... MySQL (oder MariaDB) werden es erst bemerken, wenn Sie den Datenbankdienst neu starten:

service mysqld restart

(oder)

service mariadb restart
4
inanutshellus

Um die Standardzeitzone auf MariaDB einzustellen, müssen Sie zur Datei 50-server.cnf gehen.

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

Dann können Sie im mysqld-Bereich folgenden Eintrag 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!

1
Lukas Kuntze

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

1

Um herauszufinden, was die Zeitzone ist, können Sie zunächst eine Abfrage durchführen

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 bestimmten Zeitzone wie CDT befinden, anstatt in einer EST-Zone, können Sie die Uhrzeit überprüfen, zu der sich Ihre Maschine Ihrer Meinung nach befindet, indem Sie sagen

SELECT NOW();

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

Wenn Sie sich auf einem gemeinsam genutzten Server befinden, weil Sie einen Hosting-Service haben, lesen Sie bitte diese Antworten , um die Datei php.ini oder die Datei .htaccess zu ändern.

1
Erik Toor

Unter Windows (IIS) müssen die MySQL-Zeitzonen-Beschreibungstabellen zuerst 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 globale Zeitzone festlegen und das Problem beheben, bei dem SELECT NOW () auftrat. gab GMT eher als BST zurück.

0