Jackson Joda 模块将 ISO 日期反序列化为 Joda DateTime

Jackson Joda Module deserialize ISO Date to Joda DateTime

我正在使用 Spring 从网络检索 JSON 数据 API rest API,使用 Jackson Joda 模块反序列化 ISO 日期,并转换它变成了 Joda DateTime.

Spring 请求:

HttpEntity<?> httpEntity = new HttpEntity<>(headers);
    final ResponseEntity<returnedEntities> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, EntitiesList.class);

实体有一个 属性 是一个 Joda DateTime

/**
 *
 * @return
 * The departureDate
 */
@JsonProperty("departureDate")
public DateTime getDepartureDate() {
    return departureDate;
}

/**
 *
 * @param departureDate
 * The departureDate
 */
@JsonProperty("departureDate")
public void setDepartureDate(DateTime departureDate) {
    this.departureDate = departureDate;
}

我的问题是服务器返回 JSON 的本地时间如下:

"departureDate": "2017-10-03T00:00:00+01:00",

所以上面代表 10 月 3 日,+01 代表我们在英国夏令时比格林威治标准时间早 1 小时。

现在 Jackson JSON 模块似乎正在剥离时区信息,有效地将时间转换为 GMT 日期时间。 所以返回的 Joda DateTime 是:

2017-10-02T23:00:00.000Z

10 月 2 日晚上 11 点,这是错误的日期。

我需要做什么才能让 Jackson Joda 模块在将 Json 转换为 Joda DateTime 时存储 +1:00 时区?

目前我有一个普通的 Joda 模块:

JodaModule jodaModule = new JodaModule();
jsonConverter.getObjectMapper().registerModule(jodaModule);
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = mappingJackson2HttpMessageConverter.getObjectMapper();
objectMapper.registerModule(jodaModule);

MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = mappingJackson2HttpMessageConverter.getObjectMapper();
objectMapper.registerModule(jodaModule);

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);           
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
listHttpMessageConverters.add(mappingJackson2HttpMessageConverter);
restTemplate.setMessageConverters(listHttpMessageConverters);

反序列化时,默认情况下,Jackson 将日期调整为 context timezone. In your case, it's adjusting it to UTC (2017-10-03T00:00:00+01:00 is equivalent to 2017-10-02T23:00:00.000Z - the Z in the end of the String is the UTC designator)。

为避免这种情况并保留输入的时区,您可以禁用 ADJUST_DATES_TO_CONTEXT_TIME_ZONE feature:

objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

有了这个,输入 String 例如 2017-10-03T00:00:00+01:00 将被反序列化为 Joda 的 DateTime,值为 2017-10-03T00:00:00.000+01:00.