杰克逊在反序列化期间更改日期

时间:2018-11-30 10:42:51

标签: android date kotlin jackson

我有一个类似这样的日期对象:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@get:JsonProperty("date") val date: Date

问题是,当我的应用程序将此日期对象设置为Fri Nov 30 00:00:00 CET 2018时,杰克逊将在反序列化期间将此日期设置为2018-11-29。有人可以提示我问题所在吗?

我的最低API级别是21。

3 个答案:

答案 0 :(得分:1)

我建议您使用LocalDate而不是Date。这是一个没有时区的日期,因此可以避免任何时区问题。

要对LocalDate进行正确的(反)序列化,您需要对Jackson附加依赖:

implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.5")

答案 1 :(得分:1)

鉴于讨论和回答表明Java 8 LocalDate将解决此问题,但是鉴于您的最低API级别为21,因此这不是您的选择,替代解决方案是joda-time

它提供了一个LocalDateTime类,其中不包含任何时区信息。可以使用jackson-datatype-joda模块将其与jackson集成。您将必须像这样注册模块:

val objectMapper = ObjectMapper().apply { 
      registerModule(JodaModule())
}

答案 2 :(得分:0)

您需要在ObjectMapper上配置时区:

    val mapper = ObjectMapper().apply {
        setTimeZone(TimeZone.getDefault())
    }