Mysql
 sql >> Datenbank >  >> RDS >> Mysql

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

useTimezone ist eine ältere Problemumgehung. Das MySQL-Team hat den setTimestamp/getTimestamp-Code vor kurzem umgeschrieben, aber er wird nur aktiviert, wenn Sie den Verbindungsparameter useLegacyDatetimeCode=false setzen und die neueste Version des mysql-JDBC-Connectors verwenden. Also zum Beispiel:

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

Wenn Sie den mysql-connector-Quellcode herunterladen und sich setTimestamp ansehen, ist es sehr einfach zu sehen, was passiert:

Wenn use legacy date time code =false, wird newSetTimestampInternal(...) aufgerufen. Wenn dann 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 also sicher, dass Sie Folgendes verwenden:

setTimestamp(int,Timestamp).

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

Wie das funktioniert sollte nun klar sein. Wenn Sie ein Datum konstruieren:5. Januar 2011 3:00 Uhr in Amerika/Los_Angeles (oder einer beliebigen Zeitzone) mit java.util.Calendar und Aufruf von setTimestamp(1, myDate), dann wird Ihr Datum verwendet, verwenden Sie SimpleDateFormat um es in der Datenbankzeitzone zu formatieren . Wenn sich Ihre DB also in Amerika/New_York befindet, wird sie den einzufügenden String '2011-01-05 6:00:00' konstruieren (da NY 3 Stunden vor LA liegt).

Um das Datum abzurufen, verwenden Sie getTimestamp(int) (ohne den Kalender). Wieder einmal wird die Zeitzone der Datenbank 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 - was zu viel Verwirrung führt.

Hinweis:

Es ist möglich, dass MySQL sich darüber beschwert, dass die Zeitzone des Servers mehrdeutig ist. Wenn Ihre Datenbank beispielsweise auf die Verwendung von EST eingestellt ist, gibt es möglicherweise mehrere mögliche EST-Zeitzonen in Java, sodass Sie dies für mysql-connector klären können, indem Sie ihm genau sagen, welche Zeitzone die Datenbank hat:

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

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