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

编程

首先数据库的时间是本地的正常时间,时区是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"

以上是 页面展示时间和数据库时间相差N小时的问题 的全部内容, 来源链接: utcz.com/z/516282.html

回到顶部