页面展示时间和数据库时间相差N小时的问题

心不动则不痛 提交于 2020-05-09 16:26:02

首先数据库的时间是本地的正常时间,时区是CST

项目查出来的时间使用了@JsonFormat注解转换格式如下:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 

针对数据库中一条数据的查询,数据库中的时间为

项目查询出来的时间为:

{
	"createdAt": "2020-04-27 20:12:05",
	"updatedAt": "2020-04-27 20:12:05"
}

比数据库的时间多了5个小时。

马上觉得是注解没有指定时区的原因然后将注解改为(这里有点无脑改的意思,相差5个小时跟GMT+8也没啥关联吧):

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 

再看,项目查出来的时间为:

{
	"createdAt": "2020-04-28 04:12:05",
	"updatedAt": "2020-04-28 04:12:05"
}

居然比数据库的时间多了13个小时,其实就是在之前5个小时的基础上又加了8个小时。

然后考虑是不是jdk时区的问题,在项目中使用new Date()往数据库写入一条数据,发现要比数据库中的时间晚(少)13个小时,

看一下java的时区:

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTimeZone());

结果为:Asia/Shanghai

经过一番百度,参考:https://www.cnblogs.com/dogeLife/p/11454158.html

总结:

1.jdk的时区是Asia/Shanghai,java在连接mysql数据库的时候,协议将数据库的CST时区认为是UTC-5,然后要转换为UTC+8,这样项目查询出来的时间就会比数据库时间多13个小时,而使用new Date()写入数据库时,又把UTC+8的时间转换为了UTC-5的时间,所以写入的时间少了13个小时。

2.@JsonFormat使用的时区是UTC,认为数据库的时区CST是UTC-5,所以展示出来的时间比数据的时间多5个小时。

解决:

1.在配置文件中将连接数据库的url加上参数serverTimezone=Asia/Shanghai,这样查询出来的就是数据库本来的时间不会再转换

jdbc:mysql://Xxx:xx/xxx?characterEncoding=utf-8&serverTimezone=Asia/Shanghai

 2.改变@JsonFormat的时区,加上timezone="GMT+8"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!