【问题标题】:Java Jsonb deserializing UTC datetime in ISO8601Java Json 在 ISO 8601 中反序列化 UTC 日期时间
【发布时间】:2020-03-19 09:08:13
【问题描述】:

我正在使用 JSON-B(yasson 实现)并且我正在接收具有这样字段的对象的数据

{
  ...
  "timestamp": "2020-03-19T06:42:42Z",
  ...
}

对于 UTC 日期时间值,这是完全标准的 ISO 8601。现在对应的 Java 类只声明了一个 Date 成员变量,没有其他特定的注解

...
 private Date timestamp;
...

一切似乎都运行良好,看起来 JSON-B 实现正确理解为 UTC,而无需我使用 @JsonbDateFormat 注释指定格式。我想我很确定,因为我检查过

ZonedDateTime datetimeCheck = ZonedDateTime.of(2020, 3, 19, 6, 42, 42, 0, ZoneId.of("UTC"));
Date parsedDateFromJson = myModel.getTimestamp();
boolean compareTs = parsedDateFromJson.equals(Date.from(datetimeCheck.toInstant()));

它产生 true 但是,当我运行另一个测试时,从日期时间值中删除“Z”,我期望它产生不同的结果,将日期时间值解释为本地而不是比UTC。令我大吃一惊的是,JSON-B 得到的 Date 对象是完全一样的。 我在这里想念什么?为什么 2020-03-19T06:42:42Z2020-03-19T06:42:42 是同一个东西? (我不认为他们是)。或者当没有指定时区时,JSON-B 实现是否总是将 UTC 视为默认值?

谢谢

【问题讨论】:

  • 好的。你是如何配置你的 JSON-B 实现的?我问是因为我无法将 2020-08-047T19:07:41Z2020-08-047T19:07:41 绑定到 java.util.Date 吗?我的失败与前者。

标签: java json datetime jsonb-api yasson


【解决方案1】:

或者当没有指定时区时,JSON-B 实现是否总是将 UTC 视为默认值?

正是这个。与它的名字所暗示的相反,java.util.Date 实际上并不代表一个日期,而是一个瞬间。具体来说,它表示自 UNIX 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来的毫秒数。

2020-03-19T06:42:42 是没有区域或偏移信息的日期 + 时间。当将此日期 + 时间反序列化为 java.util.Date(即某个瞬间)时,您需要决定如何解释日期 + 时间。这是UTC的日期+时间吗?这是您当地时区的日期+时间吗?

幸运的是,JSON-B 规范包含以下内容:“如果在本节中没有另外指定,则使用 GMT 标准时区和从 UTC 格林威治指定的偏移量。” 如该声明所示,作者选择将没有时区的日期 + 时间解释为 UTC 的日期 + 时间。

【讨论】:

  • 谢谢,我错过了规范中的那部分。您能否提供您阅读它的确切位置?非常感谢。我认为这是一个重要的部分,它应该更加明显和清晰
  • 规范在 GitHub 上维护,您可以在以下位置找到确切的语句:github.com/eclipse-ee4j/jsonb-api/blob/master/spec/src/main/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2023-03-15
  • 2017-08-06
  • 1970-01-01
  • 2014-12-12
相关资源
最近更新 更多