今天迁移服务的时候又踩了一个坑
一个接口在查询数据库的时候报了查不到数据的错误
但是使用同一个 service 的另一个接口在查询的时候却没有问题
于是开启 mybatis 的 debug 模式查看报错接口的 sql 语句
连同参数一起放到数据库中执行,还是查得到数据
百思不得其解
查看一下 mysql 连接的配置参数,确认连接时使用 serverTimezone=Asia/Shanghai 指定了时区
查看了另一个接口的 sql 语句,这才发现了问题所在
时间戳转换后比正常的慢了12个小时,那么就基本确认是时区的问题了
那么接下来就是解决问题了
在项目入口的 main 方法中加入 TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"))
再测试一下
修改后:
修改前:
问题到此基本解决
总结
但是为什么会出现这个问题呢,查询了一下,事实上默认的时区参数是由 JVM 决定的,而 JVM 本身是依靠系统的时区参数来确定内部运行程序默认时区参数的,因此才会出现这个问题
这边我们求证一下,由于没找到 JVM 查看默认时区的参数,因此我使用 jconsole 查看了一下
在命令行输入 jconsole 回车会出现弹窗(此处使用 linux, windows 用户自行搜索)
我选择的是 Idea 的进程,点开 VM概要
果不其然,时间慢了12小时,但是我本身系统时区设置的就是东八区,查看一下系统时区
想来又是一个大坑,还是暂且绕过,有空再深挖吧






