Java/Jackson:为什么序列化日期有一个额外的 04?

当我执行以下代码时:

System.out.println(new ObjectMapper().configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false).writeValueAsString(new SimpleDateFormat("MMMM d,yyyy",Locale.ENGLISH).parse("April 12,2001")));

我看到输出:

"2001-04-12T04:00:00.000+00:00"

我想了解 T 后面的 04 是从哪里来的?我的杰克逊依赖:

implementation("com.fasterxml.jackson.core","jackson-databind","2.11.1")
hd7429 回答:Java/Jackson:为什么序列化日期有一个额外的 04?

发生这种情况是因为您没有指定时间和时区,因此输出包含 UTC 时区中的日期时间。您的系统具有时区 UTC-4,因此,您提供的日期会增加 4 小时。

我的时区是 UTC+3,所以我得到的输出

"2001-04-11T21:00:00.000+00:00"

我建议在这种情况下使用 Java 8 时间,这样您就可以始终确定会收到什么输出。

以下代码输出

"2001-04-12T00:00:00Z"

无论您当地的时区如何。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d,yyyy",Locale.ENGLISH);

System.out.println(new ObjectMapper().registerModule(new JavaTimeModule()).configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false).writeValueAsString(LocalDate.parse("April 12,2001",formatter).atStartOfDay().atOffset(ZoneOffset.UTC)));

附言 您可以使用解析后的 LocalDate 并且没有必要将其转换为 OffsetDateTime

本文链接:https://www.f2er.com/20524.html

大家都在问