OffsetDateTime dateTime = xmlGregorianCalendar.toGregorianCalendar()
.toZonedDateTime()
.toOffsetDateTime();
System.out.println("Date-time with explicit offset: " + dateTime);
System.out.println("Offset is " + dateTime.getOffset());
С вашим XMLGregorianCalendar
это печатает:
Date-time with explicit offset: 2018-07-06T05:11:00.050Z
Offset is Z
Z
означает UTC или смещение нуля или часовой пояс Зулу. Так что это дает вам дату и время в UTC с явным смещением.
Если вам действительно нужен правильный момент времени, для этого обычно нужно Instant
:
Instant pointInTime = xmlGregorianCalendar.toGregorianCalendar()
.toZonedDateTime()
.toInstant();
System.out.println("As point in time: " + pointInTime);
Выход:
As point in time: 2018-07-06T05:11:00.050Z
Вы заметили, что дата и время печатаются точно так же, как и раньше, включая Z
для UTC. Разница в том, что OffsetDateTime
может содержать любое смещение (и будет содержать другое смещение, если ваше XMLGregorianCalendar
делает). Instant
считается моментом времени, независимым от какой-либо зоны или смещения. Только метод toString
использует UTC для печати даты и времени, а суффикс всегда будет Z
для UTC.
Что не так с вашим кодом?
Во-первых, класс SimpleDateFormat
не только давно устарел. Это также общеизвестно хлопотно, особенно когда дело доходит до разбора, но все же. TimeZone
тоже устарел. Вы предпочтете использовать java.time
, современный Java-интерфейс даты и времени, как я делаю в приведенных выше фрагментах.
Я запустил твой код и получил 2018-07-06T05:11:00.050+0000
. Смещение нуля от UTC выводится по-другому, но строка соответствует тому, что вы говорите, что хотите.
Вы не можете иметь java.util.Date
(другой устаревший класс) с часовым поясом или смещением. Он представляет собой момент времени, не более того.
Ссылки