簡體   English   中英

Java Jsonb 在 ISO8601 中反序列化 UTC 日期時間

[英]Java Jsonb deserializing UTC datetime in ISO8601

我正在使用 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()));

然而,結果為,當我運行另一個測試從日期時間值中刪除“Z”時,我期望它產生不同的結果,將日期時間值解釋為本地而不是 UTC。 出乎我的意料,JSON-B 獲取的 Date 對象完全一樣。 我在這里缺少什么? 為什么2020-03-19T06:42:42Z2020-03-19T06:42:42是一回事? (我不認為他們是)。 或者,當沒有指定時區時,JSON-B 實現是否總是將 UTC 視為默認值?

謝謝

或者,當沒有指定時區時,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 的日期 + 時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM