背景知识:

我有一个运行在Tomcat 7上的Java 1.6 web应用程序。数据库为MySQL 5.5。之前,我使用Mysql JDBC驱动程序5.1.23连接到DB。一切工作。我最近升级到Mysql JDBC驱动程序5.1.33。升级后,Tomcat在启动应用程序时会抛出这个错误。

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.

为什么会这样?


当前回答

我通过配置MySQL解决了这个问题。

SET GLOBAL time_zone = '+3:00';

其他回答

我在LibreOffice基地也遇到了同样的问题。所以我只是在连接字符串中指定了一个非“夏时制时区”。

我尝试没有“&serverTimezone=MST”,但也失败了。

我还尝试了“&serverTimezone=MDT”,失败了,所以出于某种原因,它不喜欢夏令时!

同意@bluecollarcoder的答案,但最好使用TimeZone.getDefault().getID();在连接字符串的末尾:

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

在这种情况下,Timezone参数根据本地机器时区自动更新。

我正在使用mysql-connector-java-8.0.13,遇到了同样的问题。 我在命令行控制台创建了我的数据库,并在命令行上使用@Dimitry Rud的解决方案解决了这个问题:

SET GLOBAL time_zone = '-6:00';

我不需要重新启动任何东西,设置时间并立即在eclipse中运行我的代码,它连接起来没有任何问题。

这个错误应该在旧版本中得到修复,但我想我得到了这个错误,因为我在控制台中创建数据库后,我没有设置这个。我没有使用工作台或其他应用程序来管理这个,而不是控制台。

运行下面的查询到mysql DB来解决这个错误

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;

这是mysql-connector-java从5.1.33到5.1.37版本的一个错误。 我已经在这里报告了:http://bugs.mysql.com/bug.php?id=79343

编辑: 这已经从mysql-connector-java 5.1.39修正

这是在loadtimezonemapping方法中的TimeUtil类中出现的一个拼写错误,该方法会引发NPE定位/com/mysql/jdbc/TimeZoneMapping。属性文件。如果你看一下代码,文件应该位于TimeUtil类装入器中,而不是TimeZone:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);

参数useLegacyDatetimeCode允许在使用日期时自动纠正客户端和服务器时区之间的差异。因此,它帮助您精确地不必在每个部分指定时区。虽然使用serverTimeZone参数是一种变通方法,并且在发布补丁的同时,您可以像我一样尝试自己更正代码。

如果它是一个独立的应用程序,您可以尝试简单地添加 纠正com/mysql/jdbc/TimeUtil类到你的代码,要小心 与罐子装载顺序。这可以帮助: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html 如果它是一个web应用程序,更简单的解决方案是创建自己的应用程序 Mysql-connector-java-5.1.37-patched.jar,直接替换。class 放进原来的罐子里。