最近公司接手的项目是别人开发了一半的项目,我负责的模块出现了一个关于时差的问题,数据库的时间查询到dao层,查询出来的数据差了8个小时然后找了很久发现的一个关于mybatis隐藏的坑
1,如果出现数据库的时间和我们查询的时间不对,那么不出意外应该是时差的问题,于是第一步应该是查看自己的mybatis的配置的文件是否添加了时区,这里举个例子,我们项目中使用的GMT+8而数据库中存数据使用的是UTC
jdbc.url=jdbc:mysql://localhost:3306/testSSM?serverTimezone=GMT+8&useUnicode=true&characterEncoding=utf-8
2,如果你此时任然发现时间查询出来任然不对,你就需要再仔细看看问题了,我这出现的问题是由于之前开发项目的人不喜欢写pojo实体类,使用的是map封装的返回的参数,然后mybatis默认是使用datetime去转化时间,这个时候使用datetime会默认使用当前系统的时区(我们电脑的时区是格林时区刚好差了8个小时)
- 解决方案1,DATE_FORMAT(date,format)(我没有验证过这个方法,我用的是另一种方法)*
- 解决方案2,使用pojo接受参数然后与方法一类使用fate接受然后加上注解*
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
解决方案3,使用ZonedDateTime接收,这里需要配合上面的配置文件,这个时候他是将mybatis查到的结果和时区一起存入ZonedDateTime对象中,而前端需要的就是GMT+8这个时区的值
最后你有什么其他方法可以留言一起讨论呀