使用@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;
文章讨论了在Java实体类中使用JsonFormat注解时,由于默认时区设置导致前后端时间差异的问题。通过指定timezone参数,解决了8小时的时差问题,关键在于正确处理数据库和前端的时区一致性。
3330

被折叠的 条评论
为什么被折叠?



