我试图获取日期格式为XMLGregorianCalendarddMMyyy。当我尝试将其从Date转换时,它不断抛出我:


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


反正有解决办法吗?

谢谢!

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

最佳答案

首先,如果可以避免的话,就不要使用Date类。您可能还想避免使用XMLGregorianCalendarDateSimpleDateFormat早已过时,后者尤其以麻烦而闻名。如今,现代Java日期和时间API java.time有了很多改进。有时也可以替换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。你不能那样做。或更准确地说,唯一的方法是使用字符串而不是XMLGregorianCalendarXMLGregorianCalendar.toString()生成XML格式,该格式在XML模式中定义(请参阅底部的链接)。例如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格式。显然一年是可以接受的。格式仍遵循此答案底部链接的说明。

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

链接


Oracle tutorial: Date Time解释如何使用java.time
XML Schema Part 2: Datatypes Second Edition: Lexical representation
Documentation of DatatypeFactory.newXMLGregorianCalendar(String)

09-30 21:08