jackson 默认情况下,LocalDateTime不是ISO8601

xiozqbni  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(115)

我用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();

ISO 8601中的LocalDateTime.toString也没有,ISO 8601中的z也没有了。
我有objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);禁用,这是问题吗?

envsm3lx

envsm3lx1#

LocalDateTime.toString在ISO 8601中也没有,字母Z在ISO 8601中消失了。
LocalDateTime日期的描述,用于生日,与挂钟上显示的当地时间相结合。它不能表示时间线上的一个时刻,而没有附加信息,如偏移量或时区。
Z是零UTC偏移量的区域指示符,这就是为什么从LocalDateTime示例调用toString()时看不到它。如果需要时区或偏移量,请使用ZonedDateTimeOffsetDateTime
要使用Jackson序列化(反序列化)JSR-310类型,请考虑JavaTimeModule。详情请参阅documentation
我应该使用Instant而不是LocalDateTime吗?如果是,我应该在我的PostgreSQL DB中更改什么?
检查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 |
+--------------------------------+----------------+

这与JDBC 4.2规范的表B-4和B-5非常一致。

注意

不支持ZonedDateTimeInstantOffsetTime / TIME [ WITHOUT TIMEZONE ]。还要注意,所有OffsetDateTime示例都将使用UTC(偏移量为0)。这是因为后端将它们存储为UTC。

相关问题