Это вопрос с множеством возможных ответов в зависимости от ваших обстоятельств и точных требований.Я предполагаю, что вы запрашиваете XMLGregorianCalendar
, потому что вы собираетесь использовать его в документе XML, где его метод toXMLFormat
создает необходимый вам синтаксис.
Попробуйте, если LocalDate работает
LocalDate ld = LocalDate.of(2018, Month.SEPTEMBER, 27);
System.out.println(ld);
Это выводит:
2018-09-27
Если то, что вам нужно вставить в ваш XML-документ, это дата, а не дата и времяи смещение UTC, это было бы логичным решением.Выше приведен правильный формат даты в XML (проверьте ссылки внизу).Принимает ли получатель вашего XML-документа его, я не могу сказать.Я бы узнал, если бы это был я.
Метод в вашем вопросе принимает аргумент Date
.Класс Date
давно устарел и имеет проблемы с дизайном, поэтому избегайте его, если можете.Если вы не можете избежать этого, конвертируйте его в LocalDate
следующим образом:
ZoneId zone = ZoneId.of("Europe/Rome");
LocalDate ld = date.toInstant().atZone(zone).toLocalDate();
Пожалуйста, используйте желаемый часовой пояс, в котором я поместил Европу / Рим, поскольку во всех часовых поясах эта дата никогда не бывает одинаковой.Правильный часовой пояс определяет, будет ли вы получать 26 или 27 сентября.
Использовать OffsetDateTime
ZoneId zone = ZoneId.of("Europe/Rome");
OffsetDateTime odt = LocalDate.of(2018, Month.SEPTEMBER, 27)
.atStartOfDay(zone)
.toOffsetDateTime();
System.out.println(odt);
2018-09-27T00: 00 + 02: 00
Это почти тот же синтаксис, который вы также получаете от XMLGregorianCalendar
(XMLGregorianCalendar
может также произвести его, если хотите).Секунды и миллисекунды не включены.Опять же, проверьте, все ли в порядке.Если это не так, отформатируйте OffsetDateTime
в String
для своего XML:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
String dateTimeString = odt.format(formatter);
System.out.println(dateTimeString);
2018-09-27T00: 00: 00.000 + 02: 00
Это точно соответствует синтаксису, который вы получили от XMLGregorianCalendar
в вашем вопросе, только дата и время не были изменены.Опять же, если вы не можете избежать старомодного Date
, конвертируйте:
OffsetDateTime odt = date.toInstant().atZone(zone).toOffsetDateTime();
Если вам нужен XMLGregorianCalendar
ZoneId zone = ZoneId.of("Europe/Rome");
ZonedDateTime zdt = date.toInstant().atZone(zone);
GregorianCalendar cal = GregorianCalendar.from(zdt);
XMLGregorianCalendar xmlgcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
System.out.println(xmlgcal);
2018-09-27T00: 00: 00.000 + 02: 00
Спецификация часового пояса управляет смещением, а также датой и временем.
Ссылки