2019-08-09

这次的时间出错是因为升级了 mysql 驱动导致,mysql 版本号从 5.1.30 升级到了 6.0.6。
影响了读操作,不影响写操作(已检查)。
解决方案是给 jdbc 链接加上时区 serverTimezone=GMT+8。

serverTimezone 不是 6.0 才有的,它在 3.0 的时候就有了。
为什么以前不需要加,现在需要加呢?

原因是 jdbc 驱动 6.0 修改了配置时区的实现,在不给 jdbc 链接设置时区参数的情况下,它通过 java 自身获取了时区,以前的版本有这段代码,但在这种情况下不会执行。

我们数据库默认时区 CST, 表示中国标准时区。
然而 java.util.TimeZone 开头就说明了 CST 也可以表示美国中央时间,默认选一个,并且没有给出选择标准。

 * For compatibility with JDK 1.1.x, some other three-letter time zone IDs
 * (such as "PST", "CTT", "AST") are also supported. However, their
 * use is deprecated because the same abbreviation is often used
 * for multiple time zones (for example, "CST" could be U.S. "Central Standard
 * Time" and "China Standard Time"), and the Java platform can then only
 * recognize one of them.

所以从数据库获取的 CST 中国标准时间就这样经过 java 变成了美国中央时间。

相关代码
mysql-connector-java: 5.1.32, src 源码 2212 行,
方法com.mysql.jdbc.ConnectionImpl#configureTimezone
mysql-connector-java: 6.0.6, src 源码 280 行,
方法com.mysql.cj.mysqla.MysqlaSession#configureTimezone

参考文章
jdbc mysql connector 6 时区问题

你可能感兴趣的:(2019-08-09)