MySQL JDBC-Treiber 5.1.33 - Zeitzonenproblem

360

Einige Hintergrundinformationen:

Ich habe eine Java 1.6-Webanwendung unter Tomcat 7. Die Datenbank ist MySQL 5.5. Zuvor habe ich den MySQL-JDBC-Treiber 5.1.23 verwendet, um eine Verbindung zur Datenbank herzustellen. Alles hat funktioniert. Ich habe kürzlich ein Upgrade auf den MySQL-JDBC-Treiber 5.1.33 durchgeführt. Nach dem Upgrade würde Tomcat diesen Fehler beim Starten der App auslösen.

WARNING: Unexpected exception resolving reference
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc timezone value if you want to utilize timezone support.

Warum passiert dies?

Bluecollarcoder
quelle
1
Wie sieht Ihre JDBC-URL aus?
David Levesque
Überprüfen Sie meine Antwort stackoverflow.com/a/44720416/4592448 . Ich denke, seine beste Antwort)
Fortran

Antworten:

674

Um Version 5.1.33 des MySQL JDBC-Treibers für die Arbeit mit der UTC-Zeitzone zu verwenden, muss der Wert serverTimezoneexplizit in der Verbindungszeichenfolge angegeben werden.

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Bluecollarcoder
quelle
4
Laut Dokumentation hat useJDBCCompliantTimezoneShift keine Auswirkung bei Verwendung von useLegacyDatetimeCode = false. Daher wird es dort nicht benötigt ...
Matof
24
Dies löst meinen Fehler. Zusätzlicher Hinweis, entkommen Sie dem & mit & amp; in der Datei persistence.xml: <property name = "javax.persistence.jdbc.url" value = "jdbc: mysql: // localhost / test? useUnicode = true & amp; useJDBCCompliantTimezoneShift = true & amp; useLegacyDatetimeCode = false & amp; serverTimezone = UTC" />
pdem
5
Das stimmt nicht Der VerwendungspunktLegacyDatetimeCode = false muss nicht serverTimezone angeben, damit der Client Zeitzonendifferenzen korrigiert. Es ist ein Fehler in dieser Version des MySQL-Clients.
Antgar9
2
Diese Lösung ruiniert die Zeitzone mit Ausnahme von GMT. Ich denke, die richtige Lösung wird unten unterschätzt
DuncanSungWKim
1
Lösung funktioniert mit 8.0.17. Geschah mit einer neuen MySQL-Installation. Ich kann nicht glauben, dass dieser Fehler nach so vielen Jahren nicht behoben wurde.
Tilman Hausherr
101

Ich habe dieses Problem durch die Konfiguration von MySQL gelöst.

SET GLOBAL time_zone = '+3:00';

Dmitriy Rud
quelle
6
Wenn Sie die MSK-Zeitzone +3 verwenden, können Sie folgendes als Datenbankadresse verwenden : jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow. Es sieht so aus, als ob mysql-connector kurze Zeitzonennamen nicht versteht.
Babay
2
Was machen Sie, wenn die Sommerzeit die Uhr ändert?
Isapir
3
Mit MySQL 8.0 können Sie "set persist time_zone = '+00: 00';" um es dauerhaft auf UTC zu setzen, ohne my.cnf bearbeiten oder den Server neu starten zu müssen. Siehe mysqlserverteam.com/…
ccleve
Wenn Sie dies über eine eindeutige manuelle SQL-Abfrage festlegen, wird diese Einstellung auf den ursprünglichen Wert nach einem Neustart der Datenbank zurückgesetzt.
CBA110
funktioniert - denken Sie daran, Ihre lokale Zeitzonenzeichenfolge anstelle von +3 SET GLOBAL time_zone = '+3: 00' zu ändern.
Pravin
61

Nachdem ich mehrere Beiträge zu diesem Thema gelesen, verschiedene Konfigurationen getestet und einige Erkenntnisse aus diesem MySQL-Bug-Thread gewonnen habe , habe ich Folgendes verstanden:

  • Die Server-Zeitzone ist insbesondere wichtig, um in der Datenbank gespeicherte Daten in die Zeitzone des Anwendungsservers zu konvertieren. Es gibt andere Implikationen, aber dies ist die auffälligste
  • GMT x UTC-Zeitzonensysteme. GMT wurde im späten 19. Jahrhundert konzipiert und kann zwischen Standardzeit und Sommerzeit verschoben werden. Diese Eigenschaft kann dazu führen, dass der Datenbankserver in die Sommerzeit wechselt und die Anwendung dies nicht bemerkt (möglicherweise gibt es andere Komplikationen, aber ich habe nicht weiter nachgeforscht). UTC ändert sich nicht über die Zeit (sie liegt immer innerhalb von etwa 1 Sekunde der mittleren Sonnenzeit bei 0 ° Länge).
  • Die Definition von serverTimeZone wurde in den Versionen 5.1 von mysql jdbc connectors eingeführt. Bis Version 8 konnte es ignoriert werden useLegacyDatetimeCode=true, wodurch useJDBCCompliantTimezoneShift=truedie Anwendung in Verbindung mit die Datenbankzeitzone für jede Verbindung abrufen würde. In diesem Modus werden GMT-Zeitzonen wie "British Summer Time" in das interne Java / JDBC-Format konvertiert. Neue Zeitzonen könnten in einer .properties-Datei wie dieser definiert werden
  • Ab Version JDBC-Treiber Version 8 wurden die automatische Zeitanpassung ( useJDBCCompliantTimezoneShift) und das Legacy-Zeitformat ( useLegacyDatetimeCode) entfernt ( siehe Änderungsprotokoll zum MySQL-JDBC-Connector ). Daher hat das Einstellen dieser beiden Parameter keine Auswirkung, da sie vollständig ignoriert werden (neuer Standardwert ist useLegacyDateTimeCode=false)
  • Auf diese Weise Einstellung serverTimezonewurde obligatorisch , wenn eine der Zeitzonen (application / Datenbank - Server) sind nicht im Format ‚UTC + xx‘ oder ‚GMT + xx‘
  • Das Festlegen der Serverzeit als UTC hat keine Auswirkungen (z. B. mit jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC, auch wenn sich Ihre Anwendungs- / Datenbankserver nicht in dieser Zeitzone befinden. Wichtig ist, dass die Anwendungsverbindungszeichenfolge + Datenbank mit derselben Zeitzone synchronisiert wird. Mit anderen Worten , einfach serverTimezone Einstellung = UTC mit einer anderen Zeitzone auf dem Datenbank - Server werden alle Termine verschieben aus der Datenbank extrahiert
  • Die MySQL-Standardzeitzone kann mit den Dateien my.ini oder my.cnf (Windows / Linux) durch Hinzufügen der Zeile auf UTC + 0 gesetzt werden default-time-zone='+00:00'(Details in diesem StackOverflow-Beitrag ).
  • In AWS (Amazon Web Services) konfigurierte Datenbanken erhalten automatisch die Standardzeit UTC + 0 ( siehe AWS-Hilfeseite hier ).
epol
quelle
1
Schöne Antwort, danke. Die verschiedenen Kugeln sind alle nützlich. Ich folgte dem Vorschlag, eine default-time-zone = '+00:00'in die Homebrew- /usr/local/etc/my.cnfDatei aufzunehmen. Es scheint jedoch, dass die Leerzeichen um das =Feld wichtig sind, sodass Sie das Aufzählungszeichen möglicherweise bearbeiten können, um sie einzuschließen.
Mark Edington
51

Wenn Sie Maven verwenden, können Sie einfach eine andere MySQL-Connector-Version festlegen (ich hatte den gleichen Fehler, also habe ich von 6.0.2 auf 5.1.39 geändert) in pom.xml:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>

Wie in anderen Antworten angegeben, wurde dieses Problem in Version 6.0.3 oder höher behoben, sodass Sie die aktualisierte Version verwenden können:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.3</version>
</dependency>

Maven erstellt Ihr Projekt automatisch neu, nachdem Sie die pom.xmlDatei gespeichert haben.

Gabriel Amazonas Mesquita
quelle
2
Für diejenigen, die mysql-connector-java / 6 heruntergeladen haben -> laden Sie einfach zB mysql-connector-java / 5.1.20 herunter und es sollte funktionieren. Vielen Dank!
Kombinieren Sie
6
Herabstufungen sollten vermieden werden. auch ist es nicht mit 6.0.6still behoben . besser die obige Lösung zu verwenden
phil294
Ich erhalte den gleichen Fehler auch mit dem neuesten jar [mysql-connector-java-6.0.5.jar: 6.0.5]
user2478236
18
Ich habe dies sogar in 8.0.12
Robert Niestroj
13
8.0.13 gibt den gleichen Fehler aus. 5.1.47 funktioniert jedoch bei mir.
localhost
36

Die Verbindungszeichenfolge sollte wie folgt eingestellt werden:

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

Wenn Sie die Verbindung in einer definiere xmlDatei (wie persistence.xml, standalone-full.xml, etc ..), statt &Sie verwenden sollen , &amp;einen oder verwenden CDATABlock.

Alireza Alallah
quelle
1
Das stimmt nicht Der VerwendungspunktLegacyDatetimeCode = false muss nicht serverTimezone angeben, damit der Client Zeitzonendifferenzen korrigiert.
Antgar9
Dies funktionierte für mich, als ich mit phpStorm 2019.1.4 eine Verbindung zu MySQL 5.7 herstellte.
Mauser86
29

Dies ist ein Fehler in mysql-connector-java von Version 5.1.33 bis 5.1.37. Ich habe es hier gemeldet: http://bugs.mysql.com/bug.php?id=79343

Bearbeitet: Dies wurde aus mysql-connector-java 5.1.39 korrigiert

Es war ein Tippfehler in der TimeUtil-Klasse in der loadTimeZoneMappings-Methode, der eine NPE auslöst, die die Datei /com/mysql/jdbc/TimeZoneMapping.properties findet. Wenn Sie sich den Code ansehen, sollte sich die Datei im TimeUtil-Klassenladeprogramm befinden, nicht in TimeZone:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);

Mit dem Parameter useLegacyDatetimeCode kann der Unterschied zwischen Client- und Server-Zeitzonen bei Verwendung von Datumsangaben automatisch korrigiert werden. So können Sie nicht in jedem Teil Zeitzonen angeben. Obwohl die Verwendung des Parameters serverTimeZone eine Problemumgehung darstellt und der Patch veröffentlicht wird, können Sie versuchen, den Code besser selbst zu korrigieren, als ich es getan habe.

  • Wenn es sich um eine eigenständige Anwendung handelt, können Sie einfach versuchen, Ihrem Code eine korrigierte com / mysql / jdbc / TimeUtil-Klasse hinzuzufügen, und mit der Reihenfolge des Ladens der JARs vorsichtig sein. Dies kann helfen: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • Wenn es sich um eine Webanwendung handelt, besteht die einfachere Lösung darin, eine eigene mysql-connector-java-5.1.37-patched.jar zu erstellen und die .class direkt in die ursprüngliche JAR-Datei zu ersetzen.

antgar9
quelle
Süß, danke, dass du das gemeldet hast. Ich bin froh, dass es jemandem gelungen ist, den Fehler zu beheben. Wissen Sie, wann das Update veröffentlicht wird?
Bluecollarcoder
Die von Ihnen vorgeschlagene Lösung ist großartig, aber ich denke, dass das Ändern der Treiberquelle und das Verwalten der Maven-Abhängigkeit für die meisten Menschen wahrscheinlich zu ärgerlich ist.
Bluecollarcoder
4
@Gili Dies ist nicht behoben ab Release 6.0.6
Imme22009
6
Der Fehler ist immer noch in 8.0.11
John Little
3
@ JohnLittle Ich habe dieses Problem auch in 8.0.15, aber es wird nicht mehr durch den Fehler verursacht. Zeitzonen werden korrekt geladen, aber CET und CEST (diese Zeitzonen bereiten mir Probleme) sind weder in TimeZone.getAvailableIDs()noch in enthalten, TimeZoneMapping.propertiessodass diese Lösung hier nicht hilft. Die Lösung würde wahrscheinlich wie folgt eingestellt werdenserverTimezone=Europe/Berlin
JPT
29

Ich habe das Einfügen der folgenden Verbindungszeichenfolge in die URL gelöst

jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Rafael Costa Cavalcante
quelle
1
Das stimmt nicht Der VerwendungspunktLegacyDatetimeCode = false muss nicht serverTimezone angeben, damit der Client Zeitzonendifferenzen korrigiert.
Antgar9
25

Es funktionierte für mich nur durch Hinzufügen von serverTimeZone = UTC auf application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC

Ahmed AMMOURI
quelle
22
  1. Ich habe in der MySQL-Konfigurationsdatei im Abschnitt [MySQL] hinzugefügt.

    default_time_zone='+03:00'
  2. Und starten Sie den MySQL-Server neu:

    sudo service mysql restart

Wobei +03: 00 meine UTC-Zeitzone.

Pfad zur Konfigurationsdatei auf meinem Betriebssystem Ubuntu 16.04:

/etc/mysql/mysql.conf.d/mysqld.cnf

WARNUNG: WENN IHRE ZEITZONE SOMMER- UND WINTERZEIT HAT. SIE MÜSSEN UTC IN KONFIG ÄNDERN, WENN SIE DIE ZEIT ÄNDERN. ZWEIMAL IM JAHR (normalerweise) ODER CRONTAB MIT SUDO EINSTELLEN.

Meine URL jdbc Verbindung:

"jdbc:mysql://localhost/java"
Fortran
quelle
1
Ein Neustart von MySQL ist in fast allen Anwendungsfällen der Produktion ein Nichtstarter. Es wird noch problematischer, wenn Replikationen beteiligt sind.
Bluecollarcoder
@bluecollarcoder Nur im Abschnitt [mysqld] hinzufügen. Oder fügen Sie den Abschnitt [mysqld] hinzu, falls dieser nicht vorhanden ist. Beispiel meine Konfiguration pastebin.com/j4F7t2KS
Fortran
1
Ich habe die Datei / etc / localtime meines Linux-Servers von / usr / share / zoneinfo / US / Pacific auf / usr / share / zoneinfo / America / Los_Angeles aktualisiert und dann den MySQL-Dienst neu gestartet. Dadurch wurde das Problem für mich behoben.
Vinnyjames
In meinem Fall für die bereitgestellte Syntax ist beim Neustart ein Fehler aufgetreten, und die korrekte Syntax lautete default-time-zone='+03:00'stattdessen gemäß dieser Antwort . Kommt auch von DBeaver.
wscourge
Es ist nicht angemessen, wenn Sie jedem Entwickler in Ihrem Unternehmen mitteilen müssen, dass er seine MySQL-Konfiguration ändern soll :)
Pheromix
16

Ich habe das gleiche Problem und habe es gelöst. Hänge nur "? ServerTimezone = UTC" an meine String-Verbindung an.

#

sinossi mein problem:

java.sql.SQLException: Der Server-Zeitzonenwert 'CEST' wird nicht erkannt oder repräsentiert mehr als eine Zeitzone. Sie müssen entweder den Server oder den JDBC-Treiber (über die Konfigurationseigenschaft serverTimezone) so konfigurieren, dass ein spezifischerer Zeitzonenwert verwendet wird, wenn Sie die Zeitzonenunterstützung verwenden möchten.

my dbDriver = com.mysql.jdbc.Driver

my jar = mysql-connector-java-8.0.12.jar

my java = 1.8

my tomcat = Apache Tomcat Version 8.5.32

my MySql server = MySql ver.8.0.12 
felice de simone
quelle
14

Das obige Programm erzeugt diesen Zeitzonenfehler.

Nach Ihrem Datenbanknamen müssen Sie Folgendes hinzufügen : ?useTimezone=true&serverTimezone=UTC. Sobald Sie fertig sind, funktioniert Ihr Code einwandfrei.

Viel Glück :)

Aathil Ahamed
quelle
14

Ich habe folgendes auf meiner Datenbankseite ausgeführt.

mysql> SET @@global.time_zone = '+00:00';

mysql> SET @@session.time_zone = '+00:00';

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

Ich verwende die Serverversion: 8.0.17 - MySQL Community Server - GPL

Quelle: https://community.oracle.com/thread/4144569?start=0&tstart=0

Vishrant
quelle
Du hast meine Zeit gerettet, Freund. danke U.
Kumar
13

Alles, was wir brauchen, um das Problem zu beheben serverTimezone:

String url = "jdbc:mysql://localhost:3306/db?serverTimezone=" + TimeZone.getDefault().getID()
Ingvar
quelle
Das ist mir auch mit der neuesten Version 5.4.15 passiert. Aber behoben mit diesem: Hinzufügen von "? ServerTimezone =" + TimeZone.getDefault (). GetID () "direkt neben Ihrer Datenbank, löst die Probleme.
Tes
10

Sie können den MySQL-Connector in der Maven-Abhängigkeit verwenden.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.14</version>
</dependency>

Dann müssen Sie die richtigen Parameter in der application.propertiesDatei einstellen ,

spring.datasource.url=jdbc:mysql://localhost:3306/UserReward?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=testuser
spring.datasource.password=testpassword
# MySQL driver
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
Chaklader Asfak Arefe
quelle
9

Ich benutze mysql-connector-java-8.0.13 und hatte das gleiche Problem. Ich habe meine Datenbank in der Befehlszeilenkonsole erstellt und dieses Problem mithilfe der Lösung von @Dimitry Rud in der Befehlszeile gelöst :

SET GLOBAL time_zone = '-6:00';

Ich musste nichts neu starten, die Zeit einstellen und meinen Code sofort in Eclipse ausführen, es war ohne Probleme verbunden.

Der Fehler sollte in einer älteren Version behoben sein, aber ich glaube, ich habe diesen Fehler erhalten, weil ich ihn nach dem Erstellen der Datenbank in der Konsole nicht festgelegt habe. Ich verwende weder die Workbench noch eine andere App, um dies zu verwalten, sondern die Konsole.

RAdrian
quelle
6

Führen Sie in der MySQL-Workbench die folgenden SQL-Anweisungen aus:

  1. SET @@ global.time_zone = '+00: 00';
  2. SET @@ session.time_zone = '+00: 00';

Überprüfen Sie mit den folgenden SQL-Anweisungen, ob die Werte festgelegt wurden:

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

toof06
quelle
2
Dies funktionierte für mich, als der betreffende Fehler beim Versuch, eine Verbindung über IntelliJ IDEA herzustellen, auftrat.
Faheem Hassan Zunjani
6

Das hat bei mir funktioniert.

unter DBeaver 6.0: Gehen Sie zu Verbindungseinstellungen> Treibereigenschaften> Serverzeitzone> UTC festlegen.

Außerdem musste im Frühjahr die Boot-Konfiguration die folgende Eigenschaft festlegen.

jdbc: mysql: // localhost: /? serverTimezone = UTC

Anil Gowda
quelle
5

Damit Version 5.1.33 des MySQL JDBC-Treibers mit der UTC-Zeitzone funktioniert, muss die serverTimezone offenbar explizit in der Verbindungszeichenfolge angegeben werden.

spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
harun ugur
quelle
3

Ich hatte auch genau das gleiche Problem in LibreOffice Base. Daher habe ich in der Verbindungszeichenfolge nur eine Zeitzone angegeben, die nicht der Sommerzeit entspricht.
** Geben Sie hier die Bildbeschreibung ein **

Ich habe es ohne versucht "& serverTimezone = MST" aber das ist auch fehlgeschlagen.

Ich habe auch "& serverTimezone = MDT" ausprobiert und das ist fehlgeschlagen. Aus irgendeinem Grund mag es keine Sommerzeit!

GordR
quelle
3

Ich hatte das gleiche Problem, als ich versuchte, mit einem Spring Boot-Projekt unter Windows zu arbeiten.

Die Datenquellen-URL sollte lauten:

spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

Berkay Ernalbant
quelle
3

Führen Sie die folgende Abfrage für die MySQL-Datenbank aus, um den Fehler zu beheben

MariaDB [xxx> SET @@global.time_zone = '+00:00';
Query OK, 0 rows affected (0.062 sec)

MariaDB [xxx]> SET @@session.time_zone = '+00:00';
Query OK, 0 rows affected (0.000 sec)

MariaDB [xxx]> SELECT @@global.time_zone, @@session.time_zone;
Saurabh Asthana
quelle
3

Ich habe einen ähnlichen Fehler wie Sie erhalten, aber mein Wert für die Server-Zeitzone ist 'Afr. centrale Ouest ', also habe ich diese Schritte gemacht:

MyError (in der IntelliJ IDEA Community Edition):

    InvalidConnectionAttributeException: The server time zone value 'Afr. centrale Ouest' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to u....

Dieses Problem trat auf, als ich meinen MySQL-Server auf SQL Server 8.0 (MYSQL80) aktualisierte.

Die einfachste Lösung für dieses Problem besteht darin, den folgenden Befehl in Ihre MYSQL Workbench zu schreiben:

  SET GLOBAL time_zone = '+1:00'

Der Wert nach der Zeitzone entspricht GMT +/- Differenz in Ihrer Zeitzone. Das obige Beispiel gilt für Nordafrika (GMT + 1: 00) / oder für Indien (GMT + 5: 30). Es wird das Problem lösen.

Geben Sie den folgenden Code in Ihre MySQL Workbench ein und führen Sie die Abfrage aus

[Quelllink für Frage / Problem]

[Quelllink zur Antwort]

[Lösungs-Screenshot]

iifast
quelle
2
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/resultout? useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root",""))

Dies ist eigentlich die Lösung für dieses Problem, aber kopieren Sie es nicht einfach und fügen Sie es in Ihr Programm ein. Wenn Sie nur die Zeile lesen, finden Sie 'resultout', das ist der Name meiner Datenbank, und Sie müssen Ihre schreiben.

Es gibt drei Zeichenfolgenkomponenten: Die erste ist die URL, die zweite der Benutzername und die dritte das Kennwort. Im obigen Absatz haben wir die URL gelöscht. Die zweite und dritte String-Komponente wie Ihr Benutzername und Passwort müssen Sie entsprechend ändern.

Vielen Dank

Pratham Sarankar
quelle
1

Ich habe dieses Problem ohne einzelne Codeänderung gelöst. Gehen Sie einfach zur Systemzeiteinstellung und stellen Sie die Zeitzone ein. In meinem Fall war die Standardzeitzone UTC, die ich in meine lokale Zeitzone geändert habe. Nachdem ich alle Dienste neu gestartet hatte, funktionierte alles für mich.

Nikunj Shroff
quelle
1

Ich bin spät dran, aber wenn Sie sich durch den folgenden Fehler kämpfen und die Datenquelle (javax.sql.DataSource) verwenden:

The server time zone value 'CEST' is unrecognized or represents more than one time zone.

Setzen Sie die folgende Zeile, um den Fehler zu beheben:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerTimezone("UTC");
Rituraj Singh Rathore
quelle
1

In meinem Fall war es eine Testumgebung und ich musste eine vorhandene Anwendung erstellen, damit sie ohne Konfigurationsänderungen und wenn möglich ohne MySQL-Konfigurationsänderungen funktioniert. Ich konnte das Problem beheben, indem ich dem Vorschlag von @vinnyjames folgte und die Server-Zeitzone auf UTC änderte :

ln -sf /usr/share/zoneinfo/UTC /etc/localtime
service mysqld restart

Das war genug für mich, um das Problem zu lösen.

Dmitriusan
quelle
1

Ich habe meiner /etc/mysql/my.cnfDatei die folgende Zeile hinzugefügt :

default_time_zone='+00:00'

Neustart des MySQL-Servers:

systemctl restart mysql

Und es funktioniert wie ein Zauber.

Tadej
quelle
0

Stimmen Sie der Antwort von @bluecollarcoder zu, aber es ist besser, sie TimeZone.getDefault().getID();am Ende der Verbindungszeichenfolge zu verwenden:

"jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=" + TimeZone.getDefault().getID();  

In diesem Fall wird der TimezoneParameter abhängig von der Zeitzone des lokalen Computers automatisch aktualisiert.

Yerbol
quelle
Das stimmt nicht Der VerwendungspunktLegacyDatetimeCode = false muss nicht serverTimezone angeben, damit der Client Zeitzonendifferenzen korrigiert.
Antgar9
0

Ändern Sie einfach die Verbindungszeichenfolge mit dem folgenden Code in der Datei application.properties.


spring.datasource.url=jdbc:mysql://localhost:3301/Db?
   useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=
   false&serverTimezone=UTC
Mittal
quelle
0

Das Festlegen der Serverzeit als UTC (z. B. mit) hat keine Auswirkungen jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC , auch wenn sich Ihre Anwendungs- / Datenbankserver nicht in dieser Zeitzone befinden. Wichtig ist, dass die Anwendungsverbindungszeichenfolge + Datenbank mit derselben Zeitzone synchronisiert wird.

Mit anderen Worten, durch einfaches Festlegen serverTimezone=UTCeiner anderen Zeitzone auf dem Datenbankserver werden alle aus der Datenbank extrahierten Daten verschoben

Hermann N'ZI
quelle