一、说明
今天遇到一个查了很久的问题,具体表现为前端传过来的时间参数的时区是+0800,我用Jackson反序列化成对象时,时间解析出来还是正确的,但是我再将对象序列化为Json数据时时区又变成了+0000时区,导致前端出现了问题,但是服务器上用命令date看时,时区也是正确的。解决后在此记录一下解决方法。
1.1 @JsonFormat
用途:表示json序列化的一种格式或者类型,常用来转换时间的格式。
用法:@JsonInclude(pattern=日期的格式,timezone=默认是GMT,东八区需要使用GMT+8.值)。
(仅说明时间格式的转换)
二、示例
2.1 操作
测试数据:
{
"time1": "2022-09-16T16:26:48+0800",
"time2": "2022-09-16T16:27:48+0800"
}
实体类
@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
@ToString
public class Body{
@JsonFormat(pattern = Serializer.DATE_FORMAT, timezone = "GMT+8")
private Date time1;
@JsonFormat(pattern = Serializer.DATE_FORMAT, timezone = "GMT+8")
private Date time2;
封装Jackson的类文章来源:https://www.toymoban.com/news/detail-647615.html
public class Serializer{
public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";
private final ObjectMapper mapper = new ObjectMapper();
public Serializer() {
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
}
public Date decodeTime(String str) throws SkyLinkException {
if (str == null || str.isEmpty()) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
try {
return sdf.parse(str);
} catch (ParseException e) {
throw new SkyLinkException(e);
}
}
public String encodeTime(Date date) throws SkyLinkException {
if (date != null) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
return sdf.format(date);
}
return null;
}
public <T> String encode(T obj) throws SkyLinkException {
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new SkyLinkException(e);
}
}
public <T> T decode(String json, Class<T> cls) throws SkyLinkException {
try {
return mapper.readValue(json, cls);
} catch (IOException e) {
throw new SkyLinkException(e);
}
}
说明:此处Body类的time1、time2上如果没加上timezone = “GMT+8”,那么我调用Serializer类的encode后,结果time1和time2就变成了2022-09-16T8:26:48+0000。文章来源地址https://www.toymoban.com/news/detail-647615.html
到了这里,关于Jackson(二):@JsonFormat时间格式及时区问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!