java - 即使明确禁用,Jackson ObjectMapper 也会在反序列化时将日期调整为上下文时区

标签 java jackson jodatime

这是我要序列化/反序列化的 JSON 日期格式:

"2014-06-18T06:26:56-07:00"

Joda DateTime 字段声明如下:

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
    private DateTime dueTime;

映射器:

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT)
            .registerModule(new JodaModule())
            .disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

mapper.writeValueAsString(objectWithDT)).as("application/json")

在生成的 JSON 中,上述时区的日期更改为:

2014-06-18T13:26:56+0000

最佳答案

DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE是一个反序列化特性,在执行序列化时不考虑它。

一个可能的解决方案是创建一个带有 TimeZoneObjectMapper 实例:

ObjectMapper mapper =  new ObjectMapper()
            .enable(SerializationFeature.INDENT_OUTPUT)
            .disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
            .registerModule(new JodaModule())
            .setTimeZone(TimeZone.getTimeZone("GMT-7"));

有关更多详细信息,请查看 DateTimeSerializer代码。

关于java - 即使明确禁用,Jackson ObjectMapper 也会在反序列化时将日期调整为上下文时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38754147/

相关文章:

java - 如何在 Activiti Service Task 中立即将实体持久保存/提交到数据库

java - 在接口(interface)抽象中标记方法有什么意义吗?

java - JsonArray 输出不起作用

java - 如何映射可以具有不同类型并从另一个类扩展的请求对象数据?

java - 如何检测 Joda Time 中不明确的 DST 重叠?

java - 游戏正确结束时出现问题

java - Spinner OnItemSelected在Android Studio中不起作用

java - 使用列表填充 jTable

java - 将 org.threeten.bp.* 和 org.joda.time* 转换为相应的 java.time.* 类的最佳方法

java - 将普通语言持续时间转换为 Joda 周期或 ISO 8601