默认情况下LocalDateTime不是ISO8601

时间:2018-09-04 15:06:54

标签: java jackson

我使用LocalDateTime来表示时间。 在调试模式下,我注意到时间格式不在ISO 8601中,这使得我很难直接发送给其他api。

请求类别:

public class AgreementRequest {
    @NonNull
    private String name;
    @NonNull
    private String description;
    @JsonProperty("start_date")
    @DateTimeFormat(iso = DATE_TIME)
    @NonNull
    private String startDate;
}

初始化:

request = AgreementRequest.builder()
                .name("Premium subscription")
                .description("Montly subscription")
                .startDate(LocalDateTime.now().plusDays(1).toString()).build();

enter image description here

ISO 8601中的LocalDateTime.toString都不存在,ISO8601中的字母z也消失了。

我已禁用objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);,这是问题吗?

1 个答案:

答案 0 :(得分:5)

  

ISO 8601中的LocalDateTime.toString都不存在,ISO8601中的字母Z也消失了。

LocalDateTime对生日的日期说明,以及在挂钟上看到的本地时间。如果没有其他信息(例如偏移量或时区),则无法在时间轴上表示时刻。

Z是UTC零偏移量的区域标记,这就是为什么从toString()实例调用LocalDateTime时看不到它的原因。如果您需要时区或偏移量,请使用ZonedDateTimeOffsetDateTime

要使用Jackson来对JSR-310类型进行序列化,请考虑使用JavaTimeModule。有关详细信息,请参见documentation


  

我应该使用Instant而不是LocalDateTime吗?如果是这样,我应该在我的PostgreSQL数据库中更改什么?

检查PostgreSQL JDBC驱动程序documentation怎么说:

  

PostgreSQL™JDBC驱动程序使用JDBC 4.2实现对Java 8 Date and Time API(JSR-310)的本地支持。

PostgreSQL™                     | Java SE 8
--------------------------------+----------------
DATE                            | LocalDate
TIME [ WITHOUT TIMEZONE ]       | LocalTime
TIMESTAMP [ WITHOUT TIMEZONE ]  | LocalDateTime
TIMESTAMP WITH TIMEZONE         | OffsetDateTime
     

[...]请注意,不支持ZonedDateTimeInstantOffsetTime / TIME [ WITHOUT TIMEZONE ]。还要注意所有   OffsetDateTime将实例设置为UTC(偏移量为0)。

     

这是因为后端将它们存储为UTC。