gpt4 book ai didi

java - Xmlgregoriancalendar 不允许在 ddMMyyyy 中前导零

转载 作者:行者123 更新时间:2023-12-02 11:02:23 24 4
gpt4 key购买 nike

我尝试获取日期格式为 ddMMyyyXMLGregorianCalendar。当我尝试将其从 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 类。您可能还想避免使用 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。你不能拥有那个。或者更准确地说,唯一的方法是在字符串中,而不是在 XMLGregorianCalendar 中。 XMLGregorianCalendar.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) 的文档。

链接

关于java - Xmlgregoriancalendar 不允许在 ddMMyyyy 中前导零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com