Liv*_*ool -1 java spring datetime localdate
我在尝试从 Api 调用获取响应时收到此错误:
我从对象收到这样的字段:
"createdAt":1620133356550
Run Code Online (Sandbox Code Playgroud)
我的 Dto 有这个字段,所以我可以使用对象映射器获取值:
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime createdAt;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
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)
Run Code Online (Sandbox Code Playgroud)
对象的可能设置者:
public void setCreatedAt(long createdAt) {
Instant instant = Instant.ofEpochMilli(createdAt);
LocalDateTime localMark =
instant.atZone(ZoneId.of("Europe/Amsterdam"))
.toLocalDateTime();
this.createdAt = localMark;
}
Run Code Online (Sandbox Code Playgroud)
那是因为你要求杰克逊默默地将苹果变成梨,但它不会这样做。如果没有额外的信息,就无法做到这一点。
这:1620133356550看起来像自纪元以来的毫秒值。
这代表时间上的一个瞬间。即时时间和 LocalDateTime 是一种真枪实弹的情况:它们几乎完全不相关,并且一个不能转换为另一个;至少,不是没有这里根本不存在的参数。
首先,您需要“本地化”时间戳:这是自某个时刻以来的毫秒数。哪个瞬间?常见格式是“UTC 时区自 1970 年新年午夜以来的毫秒数”。如果确实如此,那么您需要做的就是说Instant.ofEpochMilli(1620133356550L),现在您就可以正确地表示它(即,作为一个 Instant)。
但这仍然不是 LocalDateTime。问题是:对谁来说是本地的?
除了太空飞行、一般航空和相互通信的计算机之外,UTC 实际上并未被任何人使用。除非您正在编写专门用于在 Dragon 太空舱而不是其他地方运行的软件,否则根据定义,这还没有准备好按照本地日期和时间来表示。
首先,您需要将即时信息转换为语言环境。然后你就可以有一个 LocalDateTime 了。
例如,如果您想知道:好吧,如果我在java.time.Instant我制作的这个时刻在阿姆斯特丹周围散步,然后我问某人日期和时间,他们会说什么?然后你就可以:
Instant instant = Instant.ofEpochMilli(1620133356550L);
LocalDateTime localMark =
instant.atZone(ZoneId.of("Europe/Amsterdam"))
.toLocalDateTime();
Run Code Online (Sandbox Code Playgroud)
如果这是某种奇怪的格式,其中 LocalDateTime 通过以下方式序列化:获取本地日期时间,假设您通过询问国际空间中的某个人来询问该确切时刻的当前日期和时间,从而将其转换为瞬间站,然后把它变成纪元并把它放在电线上,好吧,然后,写下来。在上面的代码中使用ZoneOffset.UTC代替。ZoneId.of("Europe/Amsterdam")
| 归档时间: |
|
| 查看次数: |
3013 次 |
| 最近记录: |