Jackson jsonformat始终以UTC格式反序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jackson jsonformat始终以UTC格式反序列化相关的知识,希望对你有一定的参考价值。

杰克逊的jsonformat注释并不像我预期的那样。

让我们说在Java SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
Date date = sdf.parse("1-Mar-2018");

date对象值是1-Mar-2018 SGT。这很好,因为我的时区在新加坡。

现在我有一个发布json值的http web服务:

{
  "filterDate": "01-Mar-2018"
}

在我的bean中,我用它来注释它

@JsonFormat(pattern = "dd-MMM-yyyy")
public void setDeliveryDate(Date deliveryDate) {
    this.deliveryDate = deliveryDate;
}

好的deliveryDate的值是1-Mar-2018 UTC

虽然我这样做:

@JsonFormat(pattern = "dd-MMM-yyyy", timezone="Asia/Singapore")
public void setDeliveryDate(Date deliveryDate) {
    this.deliveryDate = deliveryDate;
}

它仍然被反序列化为1-Mar-2018 UTC,我认为它应该是1-Mar-2018 SGT

为什么这样做?

答案

timezone参数用于根据JsonFormat documentation进行序列化,而不是用于您的帖子中的反序列化。鉴于Date“旨在反映协调世界时(UTC)”并且不包含时区信息,我不知道它如何用于反序列化。

如果要为ZonedDateTime指定时区,请考虑切换到自Java 8以来可用的deliveryDate

如果必须使用Date,则可以指定在打印或格式化任何Date对象时使用的默认时区。

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Singapore"));
System.out.println(new Date());

产生

星期二2018年3月6日二十一点15分12秒

以上是关于Jackson jsonformat始终以UTC格式反序列化的主要内容,如果未能解决你的问题,请参考以下文章

json之jackson的注解@Jsonformat

Jackson 时间格式化,时间注解 @JsonFormat 用法时差问题说明

jackson 中JsonFormat date类型字段的使用

Jackson 时间格式化,时间注解 @JsonFormat 用法时差问题说明

使用Jackson的@JsonFormat注解时出现少了 8 个小时

在 Spring MVC 中,无法使用 Jackson @JsonFormat 将输入绑定到日期字段