So ändern Sie die MySQL-Zeitzone in eine Datenbank-Verbindung mit Java?
MySQL läuft mit Zeitzone "GMT+8", aber Tomcat mit "GMT". Wenn ich speichern datetime zu meiner Datenbank, alles scheint OK zu sein, aber wenn ich die datetime Wert in der Datenbank sehe ich den "GMT" - Wert.
Auch, wenn ich versuche den Wert aus der Datenbank der Wert geändert wird, scheint der Wert in die Datenbank übernommen wird, als "GMT+8", also Java-ändert den Wert auf "GMT".
Habe ich die Verbindungs-URL wie diese:
useTimezone=true&serverTimezone=GMT
aber es funktioniert nicht.
- Tun Sie nur das "falsche" Zeitzone, oder ist der Wert falsch?
- Ändere ich die config auf useGmtMillisForDatetimes=true&serverTimezone=GMT. scheint, es ist das Verhalten, das ich will. aber immer noch verwirrt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
useTimezone ist eine ältere workaround. MySQL-team schrieb die setTimestamp/getTimestamp code ziemlich vor kurzem, aber es wird nur aktiviert, wenn Sie die Verbindungs-parameter useLegacyDatetimeCode=false und Sie sind mit der neuesten version der mysql-JDBC-connector. So zum Beispiel:
Wenn Sie die download-mysql-connector-source-code und schauen Sie setTimestamp, es ist sehr einfach zu sehen, was passiert:
Wenn die Verwendung von legacy-Datum, Zeit code = false, newSetTimestampInternal(...) aufgerufen wird. Dann, wenn die Kalender übergeben newSetTimestampInternal ist NULL, Ihre date-Objekt formatiert ist, in der Datenbank-Zeitzone:
Ist es sehr wichtig, dass Kalender ist null - so stellen Sie sicher, dass Sie mit:
... NICHT setTimestamp(int,Timestamp,Calendar).
Es sollte offensichtlich sein, jetzt, wie das funktioniert. Wenn Sie konstruieren ein Datum: 5. Januar 2011 3:00 AM in America/Los_Angeles (oder was auch immer, time zone), die über java.util.Kalender und rufen Sie setTimestamp(1, myDate), dann wird es nehmen Sie Ihre Datum, verwenden Sie " = SimpleDateFormat zum formatieren es in der Datenbank-Zeitzone. Also, wenn deine DB wird in America/New_York, es konstruiert den String '2011-01-05 6:00:00' eingefügt werden (seit New York ist vor der LA von 3 Stunden).
Zum abrufen des Datums getTimestamp(int) (ohne Kalender). Es wird wieder die Datenbank verwenden die Zeitzone, zu bauen ein Datum.
Hinweis: Der webserver Zeitzone ist völlig irrelevant jetzt! Wenn Sie nicht setzen useLegacyDatetimecode auf false, ist der webserver Zeitzone wird verwendet für die Formatierung, das hinzufügen von viel Verwirrung.
Hinweis:
Ist es möglich, meine MySQL beschweren, dass die server-Zeitzone ist mehrdeutig. Zum Beispiel, wenn Ihre Datenbank eingestellt ist, EST, möglicherweise gibt es mehrere mögliche EST Zeitzonen in Java, so können Sie diese klären für den mysql-connector, indem Sie erzählt es genau das, was der Datenbank-Zeitzone:
Brauchen Sie nur zu tun, wenn es klagt.
6.0.2
String url = "jdbc:mysql://localhost?tz=useLegacyDatetimeCode=false&serverTimezone=America/New_York";
. Für meine Anwendung in diesem Beispiel-link funktioniert:url: jdbc:mysql://localhost:3306/trip_planner?tz=useLegacyDatetimeCode=false&serverTimezone=Europe/Berlin
JDBC verwendet eine so genannte "Verbindungs-URL", damit man flüchten kann "+" durch "%2B", das ist