记一次Java默认时区的坑

本文最后更新于:2022年9月27日 晚上

今天迁移服务的时候又踩了一个坑
一个接口在查询数据库的时候报了查不到数据的错误
但是使用同一个 service 的另一个接口在查询的时候却没有问题
于是开启 mybatisdebug 模式查看报错接口的 sql 语句

记一次Java默认时区的坑-1
连同参数一起放到数据库中执行,还是查得到数据
百思不得其解
查看一下 mysql 连接的配置参数,确认连接时使用 serverTimezone=Asia/Shanghai 指定了时区
查看了另一个接口的 sql 语句,这才发现了问题所在

记一次Java默认时区的坑-2
时间戳转换后比正常的慢了12个小时,那么就基本确认是时区的问题了
那么接下来就是解决问题了
在项目入口的 main 方法中加入 TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"))
再测试一下

修改后:

记一次Java默认时区的坑-3
修改前:

记一次Java默认时区的坑-4

问题到此基本解决

总结

但是为什么会出现这个问题呢,查询了一下,事实上默认的时区参数是由 JVM 决定的,而 JVM 本身是依靠系统的时区参数来确定内部运行程序默认时区参数的,因此才会出现这个问题
这边我们求证一下,由于没找到 JVM 查看默认时区的参数,因此我使用 jconsole 查看了一下
在命令行输入 jconsole 回车会出现弹窗(此处使用 linux, windows 用户自行搜索)

记一次Java默认时区的坑-5

我选择的是 Idea 的进程,点开 VM概要

记一次Java默认时区的坑-6

果不其然,时间慢了12小时,但是我本身系统时区设置的就是东八区,查看一下系统时区

记一次Java默认时区的坑-7

想来又是一个大坑,还是暂且绕过,有空再深挖吧


记一次Java默认时区的坑
https://blog.evil-scream.cn/2021/10/14/记一次Java默认时区的坑/
作者
evil-scream
发布于
2021年10月14日
许可协议