Java/Jackson: 为什么序列化日期多了一个04?

Java/Jackson: Why serialized date has an extra 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")

发生这种情况是因为您没有指定时间和时区,因此输出包含采用 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)));

P.S。 您可以使用已解析的 LocalDate,无需将其转换为 OffsetDateTime