首页 > 解决方案 > Xmlgregoriancalendar 不允许在 ddMMyyyy 中前导零

问题描述

我尝试XMLGregorianCalendar使用日期格式ddMMyyy。当我尝试将其从 转换时Date,它一直在抛出我:

java.lang.IllegalArgumentException:不允许前导零。

有没有办法修复它?

谢谢!

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

标签: javadateleading-zeroxmlgregoriancalendar

解决方案


Date首先,如果可以避免,则不应使用该类。您可能还想避免XMLGregorianCalendarDate并且SimpleDateFormat早已过时,而后者尤其以麻烦而闻名。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 Schema 中定义的(参见底部的链接)。例如2018-08-012018-08-01T00:00:002018-08-01T00:00:00+02:00

你的代码出了什么问题?

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

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

不过,接受前导 0 可能是一个错误,因为toXMLFormat根据newXMLGregorianCalendar(String).

链接


推荐阅读