项目中遇到一个问题,一个格式为dd/MM/yyyy的时间传到前端后,日期中的day总比数据库中保存的天数少一天,即‘10/08/2018’传过去变成了'09/08/2018',本地(北京)怎么测都没问题,但到线上(奥克兰)后,对于添加的日期,天数总要比添加值少一天。
后来想到可能是因为时差的问题,就把系统的时区改为奥克兰的,结果问题100%复现!!!
网上搜了一下,有说使用@JsonFormat(pattern="dd/MM/yyyy", timezone="GMT+12")
注解去标注相应的日期字段,然后在前端(vue.js项目)使用element-ui展示时,对日期选择框el-date-picker设置value-format属性(数据回传的日期格式),同时format属性设置页面显示的日期格式。
@JsonFormat(pattern="dd/MM/yyyy", timezone="GMT+12")
private Date checkOutDate;
这样试了一下,有效果,但因为每个日期字段使用方式不一样,导致其他的字段显示不出来,后来看到一篇文章 Java 日期 解析减少一天问题。神奇,按照里面的方法,即对PO类中时间字段的get方法里,添加一句代码:
private Date checkOutDate;
public Date getCheckOutDate() {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+12"));
return checkOutDate;
}
使用这种方法,可以完美解决这个问题!
原因:
时差问题(夏令时)
timestamp与datetime区别:
timeType | Storage | format | timezoneTransfer |
---|---|---|---|
timestamp | 4 byte | UTC格式保存 | 存储时对当前的时区进行转换,检索时再转换回当前时区 |
datetime | 8 byte | 实际格式保存 | 与时区无关 |
网友评论