我有一个场景,我必须将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
还有其他办法吗?
答案 0 :(得分:1)
我认为您所需的结果是XMLGregorianCalendar
,如2018-06-30T00:00:00.000+02:00
(至少这是我在计算机上运行代码时得到的结果(可行))。
此答案进一步假定您从SQL数据库获取java.sql.Date
,并且希望XMLGregorianCalendar
获得String
从toXMLFormat
方法获得的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
。