页面展示时间和数据库时间相差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