Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 默认情况下,LocalDateTime不是ISO8601_Java_Jackson - Fatal编程技术网

Java 默认情况下,LocalDateTime不是ISO8601

Java 默认情况下,LocalDateTime不是ISO8601,java,jackson,Java,Jackson,我使用LocalDateTime来表示时间。 在调试模式中,我注意到时间格式不在ISO8601中,这使得我很难直接发送到其他API 请求类: public class AgreementRequest { @NonNull private String name; @NonNull private String description; @JsonProperty("start_date") @DateTimeFormat(iso = DATE_T

我使用
LocalDateTime
来表示时间。 在调试模式中,我注意到时间格式不在ISO8601中,这使得我很难直接发送到其他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();

LocalDateTime.toString
在ISO8601中不存在,ISO8601中的字母
z
也不存在

我有
objectMapper.configure(SerializationFeature.WRITE_DATES_作为时间戳,false)已禁用,这是问题所在吗

LocalDateTime.toString
在ISO8601中不存在,ISO8601中的字母
Z
也不存在

对日期的描述,用于生日,与挂钟上显示的当地时间相结合。如果没有诸如偏移量或时区之类的附加信息,它不能表示时间线上的某个瞬间

Z
是UTC零偏移量的区域指示符,这就是从实例调用时看不到它的原因。如果需要时区或偏移量,请使用或

到(de)序列化杰克逊类型,请考虑。有关详细信息,请参阅



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

检查PostgreSQL JDBC驱动程序对此的说明:

PostgreSQL™ JDBC驱动程序使用JDBC 4.2实现对(JSR-310)的本机支持

PostgreSQL™                     | Java SE 8
--------------------------------+----------------
DATE                            | LocalDate
TIME [ WITHOUT TIMEZONE ]       | LocalTime
TIMESTAMP [ WITHOUT TIMEZONE ]  | LocalDateTime
TIMESTAMP WITH TIMEZONE         | OffsetDateTime
[…]请注意,
ZonedDateTime
Instant
OffsetTime
/
TIME[无时区]
不受支持。还要注意的是
OffsetDateTime
will实例将使用UTC(偏移量为0)

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


LocalDateTime.toString在ISO8601中不存在,ISO8601中的字母z也不存在。ISO-8601不需要字符串上的时区;显示的字符串是完全有效的ISO-8601日期时间字符串。如果没有时区,ISO-8601假定为“本地时间”。假定类为
LocalDateTime
,则该表示有意义。“本地”部分表示LocalDateTime用于没有时区的日期/时间。我是否应该使用
Instant
而不是
LocalDateTime
?如果是这样,我应该在PostgreSQL DB中更改什么?@Cosaic请参阅@Cosaic使用
即时
了解实际时刻,时间线上的一个点,以UTC为单位。当您指的是所有时区或任何时区时,请使用
LocalDateTime
。它们是完全不同的动物,根本不能互换,因为
LocalDateTime
不能代表一个时刻。请参阅:。或者,如果您始终希望使用UTC时区,请使用
Instant
ZonedDateTime
/
OffsetDateTime
s仅在希望使用可变时区时有用。请注意,如果保存到诸如postgres之类的数据库(仅保存utc时间戳),实际时区可能会丢失。(某些)JPA实现支持它们。如果UTC中有一个
Instant
,我会将其转换为
LocalDateTime
,并将其存储在DB中。这是一个有效的过程吗?@Cosaic,视情况而定
Instant
LocalDateTime
是不同的东西。看看这个来自巴兹尔布尔克的。