【问题标题】:convert 'java.sql.Date' to class 'javax.xml.datatype.XMLGregorianCalendar'将“java.sql.Date”转换为“javax.xml.datatype.XMLGregorianCalendar”类
【发布时间】:2018-08-22 16:25:37
【问题描述】:

我有一个场景,我必须将 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

还有其他方法吗?

【问题讨论】:

标签: java datetime xmlgregoriancalendar


【解决方案1】:

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

此答案进一步假设您从 SQL 数据库中获取您的 java.sql.Date,并且您希望您的 XMLGregorianCalendar 用于从其 toXMLFormat 方法获得的 String。如果是这样,我建议你既不需要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 早已过时且设计不佳,所以不要使用它。相反,我使用的是现代 Java 日期和时间 API java.time 中的LocalDate。现代 API 更易于使用。

链接:Oracle tutorial: Date Time解释如何使用java.time

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 2017-07-13
    • 2013-01-27
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2019-10-20
    相关资源
    最近更新 更多