java - 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)));
解决方案
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)
.
链接
推荐阅读
- wordpress - 在没有 Ciomand Line 访问和提供商支持的情况下在 Wordpress 上安装 SSL
- python - 如何在三个维度上比较 3D 矢量与平面的方向
- c# - 数据源配置向导:无法检索表或视图的架构信息
- javascript - 为什么这个mysql错误会导致nodejs崩溃而不是去catch函数?
- overlay - AgGrid“serverSide”rowModel 无法识别自定义覆盖组件(加载和 noRows)
- python - 将两个 dfs 与一列分组并连接所有行值
- c# - 如何在应用程序和条码阅读器之间建立连接?
- mysql - mysql 无法使用本地加载数据导入以 \r\n\r\n 结尾的 csv 行
- database - DCount/检查 Access DB 字段中是否存在值
- facebook - 按 ID 查找 Facebook 个人资料 URL