服务器的时区是:
Mysql的时区是:
可以看到系统时区是东八区,而Mysql用了系统时区,在Java使用 Date now = new Date()数据类型,并存入数据库中类型为datetime的对应字段,所存储的时间为东八区时间。数据库中的时间显示:
当前端需要展示该时间时,使用JsonFormat对时间进行格式化,发现时间被转换成了GMT时间,比数据库中显示的时间少了8个小时:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date wifiSetTime;
返回给前端的时间:
为解决这个问题,可以指定JsonFormat的时区,如:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date wifiSetTime;
或者:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date wifiSetTime;
但是这种方式有个问题,不能灵活根据系统的时区来对时间进行转化,timezone的值不能用一个变量,而如果使用JsonFormat.DEFAULT_TIMEZONE,这个默认时区就是GMT, 所以参考了https://stackoverflow.com/questions/55224233/jsonformat-default-timezone-doesnt-seem-to-be-working, 修改JsonFormat的时区,在获取相关的实体方法所在的服务中加入:
@Autowired
com.fasterxml.jackson.databind.ObjectMapper objectMapper;
在方法中添加:
objectMapper.setTimeZone(TimeZone.getDefault());
至此,返回的时间可以正常了。
PS:使用SimpleDateFormat来format的时候,并不会将时间转为GMT时间,看来SimpleDateFormat的默认时区是取系统的。