我有一个 angular/spring 启动应用程序,在客户端我使用了一个 primeng 日历输入组件,它获取本地日期并将其转换为 UTC 分区日期时间。然后,我将此日期发送到 REST Controller ,并使用 LocalDateTimeDeserializer
对其进行反序列化。问题是,它只是按原样获取日期,而不真正关心服务器时区(因此 UTC 日期时间成为本地日期时间)。
我查看了源代码,这里是负责的片段:
if (string.endsWith("Z")) {
return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC);
}
不应该是:
if (string.endsWith("Z")) {
return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.of(ZoneId.systemDefault().getId()));
}
或者类似的东西?
或者关于 LocalDateTime/Timezones 的整个概念,我有什么不明白的地方吗?
最佳答案
不,它在做正确的事情 IMO。
LocalDateTime
不是“服务器本地”,而是“不在任何特定时区”。如果您有一个指示日期/时间的文本值和任何类型的时区指示符(例如,与 UTC 的偏移量或时区 ID),那么最合适的转换为 LocalDateTime
将只是忽略偏移量/ID。例如,采取:
2017-07-18T12:04:00+01:00
这是 2017-07-18T12:04:00 的 LocalDateTime
,UTC 偏移量为 +1。所以我希望将它解析为 LocalDateTime
,会得到 2017-07-18T12:04:00 的结果。
不过,我个人会尝试不这样做:将文本数据解析为最合适的值类型,然后以您想要的任何方式更改为不同类型的值。因此,如果您的输入文本始终确实具有 UTC 偏移量(可能使用 Z
表示 0),则将其解析为 OffsetDateTime
,然后 您决定如何将其转换为 LocalDateTime
,您的代码将更加清晰。
基本上,将“将表示从文本更改为内存”和“更改所表示的内容”分成不同的操作。
关于java - 来自 jsr310 的 LocalDateTimeDeserializer 是否正确反序列化祖鲁日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45164739/