4

我有一个场景,我必须转换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.对于数据类型工厂

有没有其他方法可以做到这一点?

4

1 回答 1

1

我假设您想要的结果是XMLGregorianCalendar类似2018-06-30T00:00:00.000+02:00的(至少这是我在计算机上运行您的代码时得到的结果(它有效))。

这个答案进一步假设您是从 SQL 数据库中获取的,java.sql.Date并且您想要从其方法中获取的。如果是这样,我建议您既不需要也不(没错)。XMLGregorianCalendarStringtoXMLFormatjava.sql.DateXMLGregorianCalendar

要从结果集中获取日期:

    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 日期和时间 API 的 java.time。现代 API 使用起来要好得多。

链接: Oracle 教程:日期时间解释如何使用java.time.

于 2018-03-14T20:33:21.060 回答