Java Jsonb десериализация даты и времени UTC в ISO8601

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

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

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

Спасибо

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам