Java Jsonb десериализует UT C datetime в ISO8601 - PullRequest
1 голос
/ 19 марта 2020

Я использую JSON -B (реализация yasson), и я получаю данные для объекта с таким полем, как это

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

, которое является совершенно стандартным ISO 8601 для UT C дата-время. Теперь соответствующий класс Java просто объявляет переменную-член Date без каких-либо других указаний c

...
 private Date timestamp;
...

все выглядит нормально, и похоже, что реализация JSON -B правильно понимает, что как UT C без необходимости указания формата с помощью аннотации @ 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' из значения даты и времени, которое я ожидал, что он даст другой результат, интерпретируя значение даты и времени как локальное, а не как UT C. К моему большому удивлению, объект Date, полученный с помощью JSON -B, был точно таким же. Что мне здесь не хватает? Почему 2020-03-19T06: 42: 42Z и 2020-03-19T06: 42: 42 - это одно и то же? (Я не думаю, что они). Или, может быть, реализация JSON -B рассматривает UT C по умолчанию всегда, когда часовой пояс не указан?

Спасибо

1 Ответ

0 голосов
/ 27 марта 2020

Или, может быть, реализация JSON -B рассматривает UT C по умолчанию всегда, когда не указан часовой пояс?

Именно это. Вопреки тому, что подразумевает его название, java.util.Date на самом деле не представляет дату, а момент времени. В частности, он представляет количество миллисекунд с UNIX эпохи (1 января 1970 года, 00:00:00 по Гринвичу).

2020-03-19T06:42:42 - это дата + время без информации о зоне или смещении. При десериализации этой даты + времени до java.util.Date, то есть за момент времени, вам необходимо решить, как интерпретировать дату + время. Это дата + время в UT C? Это дата + время в вашем местном часовом поясе?

К счастью для нас, спецификация JSON -B содержит следующее: "Если в этом разделе не указано иное, стандартный часовой пояс GMT и смещение указано в UT C Используется Гринвич. " Как показывает это утверждение, авторы сделали выбор интерпретации даты + времени без часового пояса как даты + времени в UT C.

...