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。您可能还想避免 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 模式中定义的(请参阅底部的 link)。例如 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 格式。显然只接受一年。格式仍然遵循此答案底部的 linked 规范。
不过,接受前导 0 可能是一个错误,因为前导零不是从 toXMLFormat
方法打印回来的,根据文档,该方法应该返回与解析后相同的字符串newXMLGregorianCalendar(String)
.
链接
我尝试使用日期格式 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。您可能还想避免 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 模式中定义的(请参阅底部的 link)。例如 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 格式。显然只接受一年。格式仍然遵循此答案底部的 linked 规范。
不过,接受前导 0 可能是一个错误,因为前导零不是从 toXMLFormat
方法打印回来的,根据文档,该方法应该返回与解析后相同的字符串newXMLGregorianCalendar(String)
.