Xmlgregoriancalendar 不允许在 ddMMyyyy 中前导零

Xmlgregoriancalendar not allowed leading zero in ddMMyyyy

我尝试使用日期格式 ddMMyyy 获取 XMLGregorianCalendar。当我试图从 Date 转换它时,它一直抛给我:

java.lang.IllegalArgumentException: Leading zeros are not allowed.

有办法解决吗?

谢谢!

DateFormat format = new SimpleDateFormat("ddMMyyyy");
XMLGregorianCalendar gTest = DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(new Date(1, 9, 2018)));

首先,如果可以避免的话,你不应该使用Date class。您可能还想避免 XMLGregorianCalendarDateSimpleDateFormat 早已过时,后者尤其以麻烦着称。今天,我们在 java.time、现代 Java 日期和时间 API 中有了更好的表现。它有时也可能取代 XMLGregorianCalendar.

但是相信您的话,您有一个老式的 Date 对象 — 可能来自遗留的 API,您现在无法更改或不想更改。您需要将其转换为 XMLGregorianCalendar。我还是更喜欢使用 java.time 进行转换。

    Date oldfashionedDate = // some Date equal to 1 August 2018 at 00:00 in my time zone;
    LocalDate modernDate = oldfashionedDate.toInstant()
            .atZone(ZoneId.systemDefault())
            .toLocalDate();
    XMLGregorianCalendar gTest = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(modernDate.toString());
    System.out.println(gTest);

这会打印:

2018-08-01

您要求格式 ddMMyyyy。你不能那样做。或者更准确地说,唯一的方法是在字符串中,而不是在 XMLGregorianCalendar 中。 XMLGregorianCalendar.toString() 生成 XML 格式,这是在 XML 模式中定义的(请参阅底部的 link)。例如 2018-08-012018-08-01T00:00:002018-08-01T00:00:00+02:00.

你的代码出了什么问题?

我无法重现您的 IllegalArgumentException。在我的 Java 10 上,01082018 的前导 0 被接受(在 Java 8 上也是如此)。然而,数据类型工厂将字符串解析为 1082018 年(从现在起超过一百万年),并且由于字符串在那里结束,所以它没有解析任何月份或日期。所以结果 XMLGregorianCalendar 只有一年,没有定义其他字段。

newXMLGregorianCalendar(String) 只接受 XML 格式。显然只接受一年。格式仍然遵循此答案底部的 linked 规范。

不过,接受前导 0 可能是一个错误,因为前导零不是从 toXMLFormat 方法打印回来的,根据文档,该方法应该返回与解析后相同的字符串newXMLGregorianCalendar(String).

链接