Java程序插入mysql数据库,时间超前8个小时的问题
1、近期发现一个问题,数据库表中字段edit_time最后更新时间,
在第一次插入,或者每更新一次update的时候,时间戳都增加了8个小时;
2、date命令发现Linux服务器时间正确:
3、通过mysql 客户端执行 select now(),发现数据库系统时间也是当前时间,没有时差:
4、并且这里设置字段更新时间edit_time是通过mysql自动执行的,以下是建表字段语句:
`edit_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录修改时间';
当mybatis执行 插入/更新 方法,没有传入edit_time值的时候,才会通过 ON UPDATE CURRENT_TIMESTAMP 更新时间;
否则就按照程序传入的edit_time值拼接成sql执行,此时 ON UPDATE CURRENT_TIMESTAMP 失效:
(例如之前表中字段edit_time数据是2020-07-25 14:40:00,取出该条数据,执行完业务逻辑以后准备update,系统当前时间是2020-07-25 14:41:45,mybatis如果不传入edit_time字段值,就不会拼接sql,那么就按照2020-07-25 14:41:45更新,ON UPDATE CURRENT_TIMESTAMP 生效;
如果edit_time传入2020-07-25 22:41:45,那么就会按照传入的2020-07-25 22:41:45进行拼接sql更新,ON UPDATE CURRENT_TIMESTAMP 失效;)
5、jdbc代码中数据库连接时区配置,为东八区时间:
serverTimezone=GMT%2B8;
在网上找了一下解决方案,有说需要改成:serverTimezone=Asia/Shanghai,但是修改后经测试也并未生效;
6、给程序增加日志,发现从数据库取出来的时候转换为java对象的时候,就把时间字段edit_time增加了8个小时,而不是在执行mybatis插入/更新方法时出的问题;
代码增加日志打印:
查看Linux打印出来的日志:
表中存储的时间本来是2020-07-25 14:41:45,
第一次取出更新变成了2020-07-25 22:41:45,第二次取出更新又增加8小时,变成2020-07-26 06:41:45;
7、查看配置文件发现这样一行:
spring.jackson.time-zone也是东八区时间,会不会由于跟jdbc的时区配置重复,导致时间再重新+8?
8、在上面增加日志的地方,找到获取java对象采用的jackson,把json对象转成java对象,结合配置文件spring.jackson.time-zone,时间确实在这里重新加了8个小时,找到问题原因;
9、解决方法:
(1)、把mybaits里面*****Mapper.xml中,所有插入/更新方法,对应的 editTime删掉;
(2)、或者转java对象时,jackson改fastjson;
(3)、或者直接删除配置spring.jackson.time-zone=GMT+8(推荐);