java - 来自 jsr310 的 LocalDateTimeDeserializer 是否正确反序列化祖鲁日期?

标签 java spring angular datetime jackson

我有一个 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/

相关文章:

Java:如何在 spring 框架中声明嵌套映射?

java - 如何将从 Controller 读取的属性文件的值注入(inject)到 bean 中?

angular - 从 Angular4 上的 md-dialog 获取数据

angular - 类型 'currentState' 上不存在属性 'FadeblockComponent'

java - Java 中的四舍五入小数

Java 终端/CMD 交互

java - 在模拟类中初始化私有(private)字段

java - 将父类放入扩展类中

angular - ng-template 的 ViewChildren

java - 如何使用子弹HeightfieldTerrainShape