我试图获取日期格式为XMLGregorianCalendar
的ddMMyyy
。当我尝试将其从Date
转换时,它不断抛出我:
java.lang.IllegalArgumentException:不允许前导零。
反正有解决办法吗?
谢谢!
DateFormat format = new SimpleDateFormat("ddMMyyyy");
XMLGregorianCalendar gTest = DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(new Date(1, 9, 2018)));
最佳答案
首先,如果可以避免的话,就不要使用Date
类。您可能还想避免使用XMLGregorianCalendar
。 Date
和SimpleDateFormat
早已过时,后者尤其以麻烦而闻名。如今,现代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
。你不能那样做。或更准确地说,唯一的方法是使用字符串而不是XMLGregorianCalendar
。 XMLGregorianCalendar.toString()
生成XML格式,该格式在XML模式中定义(请参阅底部的链接)。例如2018-08-01
,2018-08-01T00:00:00
或2018-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)