我有一个角度/弹簧启动应用程序,在客户端我使用了一个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 / Timezones的整个概念的东西?
答案 0 :(得分:3)
不,它正在做正确的事IMO。
LocalDateTime
不是“服务器本地”,它“不在任何特定时区”。如果您有一个文本值表示日期/时间和任何类别的时区指示符(例如,与UTC的偏移或时区ID),那么最合适的转换为{{1}将只是忽略偏移/ ID。例如,采取:
LocalDateTime
这是2017-07-18T12:04:00的2017-07-18T12:04:00+01:00
,UTC偏移为+1。所以我希望将它解析为LocalDateTime
,结果将是2017-07-18T12:04:00。
我个人会尽量不开始这样做:将文本数据解析为最合适的值,然后以任何你想要的方式更改为不同类型的值。因此,如果输入文本总是 具有UTC偏移量(可能使用LocalDateTime
表示0),则将其解析为Z
,然后你决定如何将其转换为OffsetDateTime
,您的代码将更加清晰。
基本上,将“从文本到内存的更改表示”和“将所代表的内容”更改为不同的操作。
答案 1 :(得分:1)
以Z
结尾的DateTime是表示 Zulu 时区的标准方式,这是 UTC 时区的另一个名称,因此原始代码段是正确的