Java 将Long转换为LocalDateTime

Java 将Long转换为LocalDateTime,java,spring,datetime,localdate,Java,Spring,Datetime,Localdate,我在尝试从Api调用获取响应时收到此错误: 我从对象接收到如下字段: "createdAt":1620133356550 public void setCreatedAt(long createdAt) { Instant instant = Instant.ofEpochMilli(createdAt); LocalDateTime localMark = instant.atZone(ZoneId.of("Europe/Amsterdam

我在尝试从Api调用获取响应时收到此错误:

我从对象接收到如下字段:

"createdAt":1620133356550
 public void setCreatedAt(long createdAt) {
        Instant instant = Instant.ofEpochMilli(createdAt);
LocalDateTime localMark =
  instant.atZone(ZoneId.of("Europe/Amsterdam"))
  .toLocalDateTime();
    this.createdAt = localMark;
  }
我的Dto有此字段,因此我可以使用对象映射器获取值:

@JsonSerialize(using = LocalDateTimeSerializer.class)
  private LocalDateTime createdAt;
我收到这个错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: raw timestamp (1620133356550) not allowed for `java.time.LocalDateTime`: need additional information such as an offset or time-zone (see class Javadocs)
对象的可能设置器:

"createdAt":1620133356550
 public void setCreatedAt(long createdAt) {
        Instant instant = Instant.ofEpochMilli(createdAt);
LocalDateTime localMark =
  instant.atZone(ZoneId.of("Europe/Amsterdam"))
  .toLocalDateTime();
    this.createdAt = localMark;
  }

那是因为你要求杰克逊默默地把一个苹果变成一个梨,但它不会这么做。如果没有其他信息,就无法做到这一点

这:
162013356550
看起来像是从历元值开始的毫秒

这表示时间上的一个瞬间。time和LocalDateTime中的Instant是真实的guns和Grammas情形:它们几乎完全不相关,不能将一个转换为另一个;至少,这里没有参数

首先,您需要“本地化”时间戳:这是从某个瞬间开始的毫秒数。什么时候?常见的格式是“1970年新年午夜后的毫秒,UTC时区”。如果真的是这样,你所需要做的就是说出来,现在你已经把它恰当地表达出来了(也就是说,作为一个瞬间)

但这仍然不是LocalDateTime。问题是:本地给谁

事实上,除了太空飞行、一般航空和计算机之间的对话之外,任何人都不使用UTC。除非你编写的软件是专门在龙太空舱上运行的,而不是其他地方,根据定义,这还没有准备好在当地的日期和时间上运行

首先,您需要将即时消息转换为区域设置。然后你可以有一个LocalDateTime

例如,如果你想知道:好吧,那么如果我在我做的
java.time.instant
所代表的确切时刻在阿姆斯特丹走来走去,我问某人日期和时间,他们会说什么?然后你会:

Instant instant = Instant.ofEpochMilli(1620133356550L);
LocalDateTime localMark =
  instant.atZone(ZoneId.of("Europe/Amsterdam"))
  .toLocalDateTime();

如果这是某种bizarro格式,其中LocalDateTime是通过以下方式序列化的:取本地日期时间,假设你正在通过询问某个人有关国际空间站的信息来询问当前的日期和时间,将其转换为瞬间,然后将其转换为epochmills并将其发送到电线上,好的,然后,写下来。在上述代码中使用
ZoneOffset.UTC
而不是
ZoneId.of(“欧洲/阿姆斯特丹”)

您的问题是什么?这个错误很好地解释了一切。
LocalDateTime
不仅仅包含一个时间点,还需要“额外的信息,如偏移量或时区”。你不需要LocalDateTime,因为你不关心这个东西是在哪里(哪个国家)创建的。你只在乎什么时候。你想要即时的,这已经发生了,所以我需要在对象的setter中这样做?我将在问题中添加和更新,以便您可以看到it@Liverpool不,杰克逊不会用你的二传手。它没有办法知道,除了从方法的名称推断,它甚至是一个setter。它可能被称为
setFoo
,实际上没有设置任何内容。Jackson使用反射设置字段。如果您想要自定义序列化,则需要将此
@JsonSerialize(using=LocalDateTimeSerializer.class)
替换为
MyCustomSerializer.class
,其中该自定义类实现所需的接口。您是否有一些exmaple用于自定义转换器