首页 > 解决方案 > 从日期格式中排除毫秒(jackson + java 8 日期)

问题描述

我试图弄清楚为什么杰克逊(2.9.5)格式错误地从java 8开始。

data class Test(
        val zonedDateTim: ZonedDateTime = ZonedDateTime.now(),
        val offsetDateTim: OffsetDateTime = OffsetDateTime.now(),
        val date: Date = Date(),
        val localDateTime: LocalDateTime = LocalDateTime.now()
)

val mapper = ObjectMapper().apply {
    registerModule(KotlinModule())
    registerModule(JavaTimeModule())
    dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")
    enable(SerializationFeature.INDENT_OUTPUT)
}

println(mapper.writeValueAsString(Test()))

从我提供的日期格式中,我希望得到没有毫秒格式的日期,但结果如下所示:

{
  "zonedDateTim" : "2018-07-27T13:18:26.452+02:00",
  "offsetDateTim" : "2018-07-27T13:18:26.452+02:00",
  "date" : "2018-07-27T13:18:26",
  "localDateTime" : "2018-07-27T13:18:26.452"
}

非常感谢任何帮助。

最好的,丹尼尔

标签: javadatekotlinjacksonobjectmapper

解决方案


dateFormat仅适用于Date对象 - 其他 3 个对象由 处理,JavaTimeModule默认情况下使用 ISO 格式。

如果你想要不同的格式,你可以使用:

val format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

val javaTimeModule = JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer(format));
javaTimeModule.addSerializer(ZonedDateTime.class, ZonedDateTimeSerializer(format));
mapper.registerModule(javaTimeModule);

您可能还需要添加mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);,但我不是 100% 确定它是必要的。

另请注意,使用该格式,您将丢失时区和偏移信息。因此,您可能需要不同的偏移/分区日期时间格式。


推荐阅读