使用@JsonFormat注解前后端时间相差8小时
在写项目时发现在实体类中使用了@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
注解,然后该时间存入数据库也正常,从数据库中取出也是正常,但是传给前端就出现问题,两边的时间相差了 8
小时。
- 配置文件:
url: jdbc:mysql://localhost:3306/xxx?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
注意:
gmtCreate
只是数据库中习惯命名,并非使用的是GMT
时间。
原始写法
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date gmtModified;
- 程序获取到的时间:
- 数据库中存入的时间:
- 前端接收到的时间:
问题剖析:
- 程序-数据库: 程序中获取的是当前的系统时间,取决于服务器的时间,所以获取的时间是正确的,然后传给数据库的时候,由于两边的时区没有差别,所以在序列化的时候,时间转化是没有一点问题的。
- 数据库-程序: 从数据库取出时间的时候进行反序列化,此时两边的时区一致,时间转换没有问题,所以程序拿到的时间也是正确的。
- 程序-前端: 当程序需要将对象传输给前端时,并不明确前端的时区,所以将默认对方为
GMT
时间,所以在序列化时,由于时区的变化,得到的Json
字符串自然也发生了变化(-8
小时)。
修正写法
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date gmtCreate;
- 程序获取到的时间:
- 数据库中存入的时间:
- 前端接收到的时间:
通过在@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
注解中加入timezone = "GMT+8"
,就明确了在转为GMT
时间时将时间+8
再序列化。
当然,也可以直接指定时区:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date gmtCreate;