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, <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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.重定向概述 1.什么是重定向 将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。比如:每天凌晨定时备份...
    康酱呦阅读 1,872评论 0 0
  • Class.forName与ClassLoader的loadClass区别 经常在jdbc中看到Class.for...
    菜鸡联盟阅读 929评论 0 0
  • 何为自己? 肉之身还是灵之魂? 当然都是,之所以这样,就是发现了纷纷扰扰的乱世之中,每个人都是为自己家人生活奋斗的...
    Ruo柏阅读 1,794评论 0 0
  • 摔跤吧!爸爸:作为印度的国宝级演员,他以他自己的影响力做了自己应该做的事,里面的很多情节剪头发,穿男孩衣服对我们的...
    四维gz阅读 2,144评论 0 1
  • 今天是鸡中翅,降价了吗?外婆买来塞给我吃,稍好之后哇,又大又肥,上面还裹着一层,酱汁。 我首先舀了一大碗饭,然后夹...
    落晚笙歌阅读 1,274评论 0 0