我使用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
都不存在,ISO8601中的字母z
也消失了。
我已禁用objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
,这是问题吗?
答案 0 :(得分:5)
ISO 8601中的
LocalDateTime.toString
都不存在,ISO8601中的字母Z
也消失了。
LocalDateTime
对生日的日期说明,以及在挂钟上看到的本地时间。如果没有其他信息(例如偏移量或时区),则无法在时间轴上表示时刻。
Z
是UTC零偏移量的区域标记,这就是为什么从toString()
实例调用LocalDateTime
时看不到它的原因。如果您需要时区或偏移量,请使用ZonedDateTime
或OffsetDateTime
。
要使用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
[...]请注意,不支持
ZonedDateTime
,Instant
和OffsetTime
/TIME [ WITHOUT TIMEZONE ]
。还要注意所有OffsetDateTime
将实例设置为UTC(偏移量为0)。这是因为后端将它们存储为UTC。