webentwicklung-frage-antwort-db.com.de

Wie kann ich die MySQL-Zeitzone in einer Datenbankverbindung mit Java ändern?

MySQL läuft mit der Zeitzone "GMT + 8", aber Tomcat mit "GMT". Wenn ich datetime in meiner Datenbank speichere, scheint alles in Ordnung zu sein, aber wenn ich den datetime -Wert in der Datenbank überprüfe, sehe ich den "GMT" -Wert.

Auch wenn ich versuche, den Wert aus der Datenbank abzurufen, wird der Wert geändert. Der Wert in der Datenbank wird als "GMT + 8" angenommen. Java ändert also den Wert in "GMT".

Ich habe die Verbindungs-URL folgendermaßen eingestellt:

useTimezone=true&serverTimezone=GMT

aber es funktioniert nicht.

31
Xilang

useTimezone ist eine ältere Problemumgehung. Das MySQL-Team hat den setTimestamp/getTimestamp-Code erst kürzlich umgeschrieben. Er wird jedoch nur aktiviert, wenn Sie den Verbindungsparameter useLegacyDatetimeCode = false setzen und Sie die neueste Version des JDBC-Connectors von mysql verwenden. Also zum Beispiel:

String url =
 "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false

Wenn Sie den Quellcode für den mysql-Connector herunterladen und sich setTimestamp anschauen, ist es sehr einfach zu sehen, was passiert:

Bei Verwendung des älteren Datums/Zeitcodes = false wird newSetTimestampInternal (...) aufgerufen. Wenn der an newSetTimestampInternal übergebene Kalender NULL ist, wird Ihr Datumsobjekt in der Zeitzone der Datenbank formatiert:

this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);

Es ist sehr wichtig, dass der Kalender null ist. Stellen Sie daher sicher, dass Sie Folgendes verwenden:

setTimestamp(int,Timestamp).

... NICHT setTimestamp (int, Timestamp, Calendar).

Es sollte jetzt offensichtlich sein, wie das funktioniert. Wenn Sie ein Datum erstellen: 5. Januar 2011 um 03:00 Uhr in Amerika/Los_Angeles (oder eine beliebige andere Zeitzone) mit Java.util.Calendar und dem Aufruf von setTimestamp (1, myDate), wird Ihr Datum verwendet. Verwenden Sie SimpleDateFormat um es in der Datenbank-Zeitzone zu formatieren . Wenn sich Ihre Datenbank in Amerika/New_York befindet, erstellt sie den String '2011-01-05 6:00:00', der eingefügt werden soll (da NY um 3 Stunden vor LA liegt).

Verwenden Sie getTimestamp (int) (ohne Kalender), um das Datum abzurufen. Wieder wird die Datenbankzeitzone verwendet, um ein Datum zu erstellen.

Hinweis: Die Zeitzone des Webservers ist jetzt völlig irrelevant! Wenn Sie useLegacyDatetimecode nicht auf false setzen, wird die Zeitzone des Webservers für die Formatierung verwendet - viel Verwirrung.


Hinweis:

Es ist möglich, MySQL, dass die Serverzeitzone mehrdeutig ist. Wenn Ihre Datenbank beispielsweise für die Verwendung von EST konfiguriert ist, gibt es möglicherweise mehrere mögliche EST-Zeitzonen in Java. Sie können dies also für den mysql-Connector klarstellen, indem Sie genau sagen, wie die Datenbank-Zeitzone lautet:

String url =
 "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";

Sie müssen dies nur tun, wenn es sich beschwert.

62
nogridbag

JDBC verwendet eine sogenannte "Verbindungs-URL", dh, Sie können "+" durch "% 2B" umgehen

useTimezone=true&serverTimezone=GMT%2B8
0
Jay