我有一个角/弹簧引导应用程序,在客户端,我使用一个primeng日历输入组件,它获取本地日期并将其转换为UTC分区日期-时间。然后,我将此日期发送给REST控制器,并使用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/时区的整个概念,我还没有了解到什么呢?
发布于 2017-07-18 11:05:12
不,这样做是对的,海事组织。
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,代码将更加清晰。
基本上,将“将表示从文本转换为内存中”和“更改所表示的内容”分离为不同的操作。
发布于 2017-07-18 11:04:49
DateTime以Z结尾是表示Zulu时区的一种标准方法,这是UTC时区的另一个名称,因此原始片段是正确的。
https://stackoverflow.com/questions/45164739
复制相似问题