问题描述:
在开发过程中,遇到一个时区的问题:在数据库中的时间与代码查询出来的时间差了8小时,猜测是时区问题。
问题排查:
- 首先考虑是否在 application.yml 中数据库连接中指定了时区,没有则在链接后加上参数 serverTimezone=GMT%2B8,查询配置文件后发现已经加上了时区,但是问题还是存在,而之前项目没有遇到过该问题
- 给程序打断点,查看 mybatis 返回时间,发现时间与数据库一致,但是返回前端转换成日期格式后出现时差,经过查询资料,发现是 json 格式化的问题,默认时区为UTC,和北京时间差8小时。
解决办法:
- 在pojo类中需要格式化日期的字段上的注解 @JaonFormat 加上参数 timezone = "GMT+8"即可。
- 也可以在配置文件中全局指定json解析日期的时区
总结:
数据库时间和查询出的时间不一致大概率是时区不一致导致的,而时区不一致的因素有很多:服务器时区、MySQL时区、MySQL连接,以及最后的实体类时间转换过程。因此,需要一步一步逐步排查问题。
参考文章: Mybatis(JsonFormat)+PostgreSQL:提取的时间与实际存储时间不同、后台接收前台数据和时间数据JsonFormat和DateFormat、数据库时间和查询出来的时间不一致问题解决
评论区