Преобразовать java.sql.Date в класс javax.xml.datatype.XMLGregorianCalendar
У меня есть сценарий, где я должен конвертировать java.sql.Date
к классу javax.xml.datatype.XMLGregorianCalendar
и я попробовал следующее
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(financialTransactionProcessDataObj.invReceivedDate);
DatatypeFactory dTF = DatatypeFactory.newInstance();
XMLGregorianCalendar date = dTF.newXMLGregorianCalendar(cal);
я получаю
java.lang.SecurityException: Restricted method invocation.
для DatatypeFactory
Есть ли другой способ сделать это?
1 ответ
Я предполагаю, что ваш желаемый результат XMLGregorianCalendar
лайк 2018-06-30T00:00:00.000+02:00
(по крайней мере, это результат, который я получаю при запуске вашего кода на моем компьютере (это работает)).
Этот ответ также предполагает, что вы получаете java.sql.Date
из базы данных SQL, и что вы хотите, чтобы ваш XMLGregorianCalendar
для String
что вы получаете от его toXMLFormat
метод. Если это так, я полагаю, что вам тоже не нужно java.sql.Date
ни XMLGregorianCalendar
(вот так).
Чтобы получить дату из набора результатов:
LocalDate invReceivedDate = yourResultSet.getObject("inv_receive_date", LocalDate.class);
Я не проверял код, и вы, конечно, должны заменить правильную метку столбца вместо inv_receive_date
, При использовании JPA современная версия может дать вам LocalDate
объект тоже.
Чтобы получить вашу строку для XML:
OffsetDateTime date = invReceivedDate.atStartOfDay(ZoneId.systemDefault())
.toOffsetDateTime();
System.out.println(date.toString());
В моем тестовом прогоне это напечатано
2018-06-30T00:00+02:00
Если вы сравните со строкой, которую я получил от date.toXMLFormat()
раньше вы заметите, что секунды и доли секунды не печатаются. Это, наверное, хорошо. Формат - ISO 8601, и в соответствии с этим стандартные секунды и доли секунды являются необязательными, поэтому оставьте их, когда они равны 0, должны работать. Если у вас есть особые требования для их включения, вы можете использовать
DateTimeFormatter formatterForXml
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
System.out.println(date.format(formatterForXml));
На этот раз вывод
2018-06-30T00:00:00.000+02:00
Точно так же, как от date.toXMLFormat()
до. Также возможно, что вам нужна только дата без учета времени суток и смещения UTC. Если так, то все еще проще:
System.out.println(invReceivedDate.toString());
Выход:
2018-06-30
Зачем? Не только потому, что это работает. java.sql.Date
давно устарел и плохо спроектирован, так что не используйте его. Вместо этого я использую LocalDate
из java.time, современного Java API даты и времени. С современным API гораздо приятнее работать.
Ссылка: Oracle, учебник: Дата и время, объясняющие, как использовать java.time
,