这次的时间出错是因为升级了 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, <strong>their
* use is deprecated</strong> 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
。
网友评论