我使用 Spring 从 Web API rest API 检索 JSON 数据,使用 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
代表我们在英国夏令时比 GMT 早 1 小时。
现在 Jackson JSON 模块似乎正在剥离时区信息,有效地将时间转换为 GMT 日期时间。
所以返回的 Joda DateTime
是:
2017-10-02T23:00:00.000Z
10 月 2 日晚上 11 点,这是错误的日期。
在将 Json 转换为 Joda DateTime
时,我需要做什么才能让 Jackson Joda 模块存储 +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 .在您的情况下,它正在将其调整为 UTC(2017-10-03T00:00:00+01:00
相当于 2017-10-02T23:00:00.000Z
- String
末尾的 Z
是 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
。
关于java - Jackson Joda 模块将 ISO 日期反序列化为 Joda DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46549421/