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

标签 java spring datetime jackson jodatime

我使用 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/

相关文章:

java - InflaterInputStream/DeflaterOutputStream 的默认压缩

java - Spring - 实体类应该包含除 getX 和 setX 之外的方法吗?

java - NoClassDefFoundError 从终端启动时(Java)

java - 如何将选择列添加到显示搜索结果的 JTable

java - RedisTemplate 在 Spring Boot 中无法获取数据

spring - 如何在Spring Security 3中设置用户角色?

java - 如何在 Spring 中加密文档或限制具有特定角色的用户的访问

mysql - 将 mysql 日期转换为 NSDate

php - 如何添加两个格式为 HH :MM:SS together? 的日期字符串

javascript - 从服务器到客户端的 UTC 偏移量