繁体   English   中英

杰克逊:使用时区ID解析ZonedDateTime

[英]Jackson: parse ZonedDateTime with timezone id

使用Spring MVC(春季启动),我可以从中反序列化ZonedDateTime

2016-07-26T05:30:47+01:00

但不是

2016-07-26T05:30:47+01:00 Europe/Paris

如何显式添加时区并仍然可以反序列化?

您可以使用可选部分(由[]分隔)来指定模式,以指示某个字段是可选的,然后使用@JsonFormat批注将其添加到相应的字段中。

例如,使用此类:

public class OptionalTimeZoneTest {

    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX[ VV]")
    private ZonedDateTime date;

    // getter and setter
}

请注意最后一部分( [ VV] ): []的模式是可选部分,因此解析器尝试解析它(如果存在)。 模式VV是区域ID(或时区的名称;有关更多详细信息,请参阅javadoc

这样,两种格式都可以读取:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
// add this to preserve the same offset (don't convert to UTC)
mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

// without timezone
String json = "{ \"date\": \"2016-07-26T05:30:47+01:00\" }";
OptionalTimeZoneTest value = mapper.readValue(json, OptionalTimeZoneTest.class);
System.out.println(value.getDate()); // 2016-07-26T05:30:47+01:00

// with timezone
json = "{ \"date\": \"2016-07-26T05:30:47+01:00 Europe/Paris\" }";
value = mapper.readValue(json, OptionalTimeZoneTest.class);
System.out.println(value.getDate()); // 2016-07-26T05:30:47+02:00[Europe/Paris]

输出为:

2016-07-26T05:30:47 + 01:00
2016-07-26T05:30:47 + 02:00 [欧洲/巴黎]

请注意,在第一种情况下,输出为2016-07-26T05:30:47+01:00 (因为它没有时区,所以应用了+01:00偏移量)。

但在第二种情况下,输出为2016-07-26T05:30:47+02:00[Europe/Paris] ,因为在Europe/Paris时区, 2016年7月26日是夏令时 (因此偏移量为+02:00 )。 并且以解析此类String时区优先的方式实现了java.time API。


如果要将所有ZonedDateTime实例都转换为UTC,则可以删除以下行:

mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

没有它,日期将转换为UTC,输出将是:

2016-07-26T04:30:47Z [UTC]
2016-07-26T03:30:47Z [UTC]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM