gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:32:50 31 4
gpt4 key购买 nike

我使用 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 末尾的 ZUTC 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com