MySQL JDBC Driver 5.1.33 - Time Zone Issue

前端 未结 30 1221
栀梦
栀梦 2020-11-22 05:22

Some background:

I have a Java 1.6 webapp running on Tomcat 7. The database is MySQL 5.5. Previously, I was using Mysql JDBC driver 5.1.23 to connect to the DB. Ever

相关标签:
30条回答
  • 2020-11-22 05:41

    Run below query to mysql DB to resolve the error

    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;
    
    0 讨论(0)
  • 2020-11-22 05:42

    The above program will generate that time zone error.

    After your database name you have to add this: ?useTimezone=true&serverTimezone=UTC. Once you have done your code will work fine.

    Best of luck :)

    0 讨论(0)
  • 2020-11-22 05:44

    After reading several posts on this topic, testing different configurations and based on some insights from this mysql bug thread that's what I have understood:

    • the server time zone is important in particular to convert dates stored in the database to the time zone of the application server. there are other implications but this is the most noticeable one
    • GMT x UTC time zone systems. GMT was conceived in the late 19th century and can be shifted between standard time and summer time. this property could lead to a situation where the database server shifts to summer time and the application doesn't notice it (perhaps there are other complications but I didn't research further). UTC does not vary over time (it is always within about 1 second of mean solar time at 0° longitude).
    • serverTimeZone definition was introduced in mysql jdbc connectors versions 5.1 ahead. until version 8 it could be ignored with useLegacyDatetimeCode=true , which in conjunction with useJDBCCompliantTimezoneShift=true would make the application get the database time zone on every connection. In this mode GMT time zones such as 'British Summer Time' would be converted to the internal java/JDBC format. New time zones could be defined in a .properties file such as this one
    • Starting with jdbc driver version 8, automatic time matching (useJDBCCompliantTimezoneShift) and legacy time format (useLegacyDatetimeCode) were removed (see mysql jdbc connector changelog). therefore setting these 2 parameters has no effect as they are completely ignored (new default is useLegacyDateTimeCode=false)
    • In this manner setting serverTimezone became mandatory if any of the time zones (application/database servers) are not in the format 'UTC+xx' or 'GMT+xx'
    • There is no impact of setting server time as UTC (for instance with jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC, even if your application / database servers are not in this timezone. The important is for the application connection string + database to be synchronized with the same time zone. In different words, simply setting serverTimezone=UTC with a different time zone on the database server will shift any dates extracted from the database
    • The MySQL default time zone can be set to UTC+0 with the my.ini or my.cnf files (windows / linux respectively) by adding the line default-time-zone='+00:00' (details in this StackOverflow post)
    • Databases configured on AWS (amazon web services) are automatically assigned UTC+0 default time (see AWS help page here)
    0 讨论(0)
  • 2020-11-22 05:45

    I've solved this problem by configuring MySQL.

    SET GLOBAL time_zone = '+3:00';

    0 讨论(0)
  • 2020-11-22 05:46

    Apparently, to get version 5.1.33 of MySQL JDBC driver to work with UTC time zone, one has to specify the serverTimezone explicitly in the connection string.

    spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    
    0 讨论(0)
  • 2020-11-22 05:47
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/resultout? useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root",""))
    

    This is actually the solution to this problem, but don't just copy and paste it in your program. If you just read the line you will find 'resultout', that's the name of my database, and you have to write your's.

    There are three string components, first one is url, second is username, and third one is password. In above paragraph we cleared, url. The second and third String components as said your username and password you have to change accordingly.

    Thanks

    0 讨论(0)
提交回复
热议问题