Date
首先,如果可以避免,则不应使用该类。您可能还想避免XMLGregorianCalendar
。Date
并且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-01
,2018-08-01T00:00:00
或2018-08-01T00:00:00+02:00
。
你的代码出了什么问题?
我无法重现您的IllegalArgumentException
. 在我的 Java 10 上,前导 001082018
被接受(在 Java 8 上也是如此)。但是,数据类型工厂将字符串解析为 1082018 年(从现在起超过一百万年),并且由于字符串在那里结束,因此它没有解析任何月份或月份中的某天。所以结果XMLGregorianCalendar
只有一年,没有定义其他字段。
newXMLGregorianCalendar(String)
仅接受 XML 格式。显然只接受一年。格式仍然遵循此答案底部链接的规范。
不过,接受前导 0 可能是一个错误,因为toXMLFormat
根据newXMLGregorianCalendar(String)
.
链接