【问题标题】:Is LocalDateTimeDeserializer from jsr310 deserializing zulu dates correctly?来自 jsr310 的 LocalDateTimeDeserializer 是否正确反序列化祖鲁日期?
【发布时间】:2017-07-18 10:54:30
【问题描述】:

我有一个角度/弹簧启动应用程序,在客户端我使用一个primeng日历输入组件,它获取本地日期并将其转换为UTC分区日期时间。然后我将此日期发送到 REST 控制器,并使用 LocalDateTimeDeserializer 对其进行反序列化。问题是,它只是按原样获取日期,而不真正关心服务器时区(因此 UTC 日期时间成为本地日期时间)。

我查看了源代码,这里是负责的 sn-p:

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 的整个概念有什么不明白的地方吗?

【问题讨论】:

    标签: java spring angular datetime jackson


    【解决方案1】:

    不,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,您的代码会更清晰。

    基本上,将“将表示从文本更改为内存”和“更改所表示的内容”分成不同的操作。

    【讨论】:

    • 这回答了我的问题。我显然误解了 LocalDateTime 的概念。
    【解决方案2】:

    Z结尾的DateTime是表示Zulu时区的标准方式,是UTC时区的别称,所以原来的sn-p是正确的.

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 2020-10-29
      • 1970-01-01
      • 2018-04-02
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多