Извлечение даты из XMLGregorianCalendar - PullRequest
0 голосов
/ 06 июля 2018

Я работал над задачей, в которой мне нужно получить Date из XMLGregorianCalendar. Я преобразовал его в GregorianCalendar и попытался получить из него дату. Но я вижу разницу между исходной датой, хранящейся в XMLGregorianCalendar, и датой, полученной из toGregorianCalendar, я дата должна быть в формате UTC, а часовой пояс источника также указан в формате UTC. Пожалуйста, найдите фрагмент кода для справки.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ";
sdf.setTimeZone(TimeZone.getTimeZone("UTC"))
String date = sdf.format(xmlGregorianCalendar.toGregorianCalendar().getTime());

Мне интересно, есть ли способ получить Date из XMLGregorianCalendar с часовым поясом UTC и без разницы во времени. Ниже приведен пример исходной даты, хранящейся в XMLGregorianCalendar

2018-07-06T05:11:00.050Z

Я ожидаю точно такую ​​же дату, что и строка, после того как я отформатирую ее с SimpleDateFormat. Ваша помощь очень ценится, заранее спасибо!

1 Ответ

0 голосов
/ 06 июля 2018
    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 (другой устаревший класс) с часовым поясом или смещением. Он представляет собой момент времени, не более того.

Ссылки

...