Jackson jsonformat 总是在 UTC 中反序列化
Jackson jsonformat deserialize always in UTC
Jackson 的 jsonformat
注释与我预期的不太一样。
假设 Java SimpleDateFormat
:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
Date date = sdf.parse("1-Mar-2018");
date
对象值为 1-Mar-2018 SGT
。这很好,因为我的时区在新加坡。
现在我有一个 http 网络服务,其中 post 一个 json 值:
{
"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 and not for deserialisation as in your post. I don't see how it could be used for deserialisation given that Date "is intended to reflect coordinated universal time (UTC)" 进行序列化,不包含时区信息。
如果您想为 deliveryDate
.
指定时区,请考虑切换到 ZonedDateTime,自 Java 8 起可用
如果您必须使用 Date
,您可以指定一个默认时区,每当您打印或格式化任何 Date
对象时都会使用该默认时区,例如
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Singapore"));
System.out.println(new Date());
产生
Tue Mar 06 21:15:12 SRET 2018
Jackson 的 jsonformat
注释与我预期的不太一样。
假设 Java SimpleDateFormat
:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
Date date = sdf.parse("1-Mar-2018");
date
对象值为 1-Mar-2018 SGT
。这很好,因为我的时区在新加坡。
现在我有一个 http 网络服务,其中 post 一个 json 值:
{
"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 and not for deserialisation as in your post. I don't see how it could be used for deserialisation given that Date "is intended to reflect coordinated universal time (UTC)" 进行序列化,不包含时区信息。
如果您想为 deliveryDate
.
如果您必须使用 Date
,您可以指定一个默认时区,每当您打印或格式化任何 Date
对象时都会使用该默认时区,例如
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Singapore"));
System.out.println(new Date());
产生
Tue Mar 06 21:15:12 SRET 2018