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.