转换' java.sql.Date' to class' javax.xml.datatype.XMLGregorianCalendar'

时间:2018-03-14 08:19:26

标签: java datetime 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 个答案:

答案 0 :(得分:1)

我认为您所需的结果是XMLGregorianCalendar,如2018-06-30T00:00:00.000+02:00(至少这是我在计算机上运行代码时得到的结果(可行))。

此答案进一步假定您从SQL数据库获取java.sql.Date,并且希望XMLGregorianCalendar获得StringtoXMLFormat方法获得的java.sql.Date。如果是这样,我建议您既不需要XMLGregorianCalendar也不需要 LocalDate invReceivedDate = yourResultSet.getObject("inv_receive_date", LocalDate.class); (这是正确的)。

要从结果集中获取日期:

inv_receive_date

我没有测试过代码,你当然应该用正确的列标签代替LocalDate。如果使用JPA,现代版本也可以为您提供 OffsetDateTime date = invReceivedDate.atStartOfDay(ZoneId.systemDefault()) .toOffsetDateTime(); System.out.println(date.toString()); 对象。

获取XML字符串:

2018-06-30T00:00+02:00

在我的测试运行中打印

date.toXMLFormat()

如果你与之前从 DateTimeFormatter formatterForXml = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx"); System.out.println(date.format(formatterForXml)); 得到的字符串进行比较,你会注意到秒的秒数和分数没有被打印出来。这可能还可以。格式是ISO 8601,根据该标准秒和秒的分数是可选的,所以当它们为0时将它们留出来应该可行。如果您有特殊要求包含它们,可以使用

2018-06-30T00:00:00.000+02:00

这次输出是

date.toXMLFormat()

与之前的 System.out.println(invReceivedDate.toString()); 完全相同。您也可能只需要没有时间和UTC偏移的日期。如果是这样,它仍然更简单:

2018-06-30

输出:

java.sql.Date

为什么?不仅因为它有效。 LocalDate已过时且设计不佳,因此请勿使用它。相反,我使用java.time中的java.time,即现代Java日期和时间API。现代API可以更好地使用。

链接: Oracle tutorial: Date Time解释如何使用#define LA_CC