
最近公司正在升级Spring Boot版本(从1.5升级到2.1),其间踩到一个非常隐晦的MySQL时区陷阱,具体来说,就是数据库读出的历史数据的时间和实际时间差了14个小时,而新写入的数据又都正常。如果你之前也是使用默认的MySQL时区配置,那么大概率会碰到这个问题,深究其背后的原因又涉及到很多技术细节,故整理出来分享给大家。
首先来看一下原因。升级到Boot 2.1之后,MySQL Connect/J版本也随之升级到8.0,会优先使用连接参数(serverTimezone)中指定的时区,如果没有指定,则再使用数据库配置的时区,参考下面的官宣(对应的源代码是com.mysql.cj.protocol.a.NativeProtocol#configureTimezone())。由于我们之前数据库连接参数没有指定时区,并且数据库配置的是默认的CST时区(美国中部时区,即-6:00),所以读取出来的时间出现偏差。
Connector/J 8.0 always performs time offset adjustments on date-time values, and the adjustments require one of the following to be true:
- The MySQL server is configured with a canonical time zone that is recognizable by Java (for example, Europe/Paris, Etc/GMT-5, UTC, etc.)

在将Spring Boot从1.5升级到2.1过程中,遇到MySQL时区陷阱,导致读取历史数据时间偏差14小时。问题源于MySQL Connect/J 8.0的时区处理变化。解决方案包括添加数据库连接参数或修改数据库time_zone配置。文中详细分析了时区问题产生的原因,涉及的时区转换过程以及Boot 1.5和2.0之间的差异。
最低0.47元/天 解锁文章
2308

被折叠的 条评论
为什么被折叠?



