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
当我执行以下代码时:
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