来自jsr310的LocalDateTimeDeserializer是否正确反序化zulu日期?

时间:2017-07-18 10:54:30

标签: java spring angular datetime jackson

我有一个角度/弹簧启动应用程序,在客户端我使用了一个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的整个概念的东西?

2 个答案:

答案 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 时区的另一个名称,因此原始代码段是正确的