【问题标题】:Xmlgregoriancalendar not allowed leading zero in ddMMyyyyXmlgregoriancalendar 不允许在 ddMMyyyy 中前导零
【发布时间】:2018-12-15 21:57:26
【问题描述】:

我尝试使用日期格式ddMMyyy 获取XMLGregorianCalendar。当我试图从Date 转换它时,它一直在抛出我:

java.lang.IllegalArgumentException:不允许使用前导零。

有办法解决吗?

谢谢!

DateFormat format = new SimpleDateFormat("ddMMyyyy");
XMLGregorianCalendar gTest = DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(new Date(1, 9, 2018)));

【问题讨论】:

  • 您需要XMLGregorianCalendar 格式为ddMMyyyy 来做什么?我很想问“是什么让你认为你需要……?”因为这样的事情不可能存在。请给我们更大的图景,因为我确信存在一种好方法,甚至可能是更好的方法。
  • 我需要根据给定的接口数据映射传递一个具有 ddMMyyy 格式的 XMLGregorianCalendar 对象。不知何故,我在执行测试时遇到了这个问题。但似乎这样做是无法实现的,因此可能会更改传递它的格式。
  • 我无法复制。我得到一个XMLGregorianCalendar,年份为 10041907,没有定义其他字段。这不是你所期望的,这并不难看出,但我认为没有例外。
  • 嗯...抱歉,我没有提供更多信息。我尝试的是传递一个 Day 小于 10 的日期,这意味着从 1 到 9,这将根据我的帖子生成 01082018 (ddMMyyyy) 格式。它达到了领先的零问题。

标签: java date leading-zero xmlgregoriancalendar


【解决方案1】:

首先,如果可以避免的话,你不应该使用 Date 类。您可能还想避免XMLGregorianCalendarDateSimpleDateFormat 早已过时,而后者尤其以麻烦而闻名。今天我们在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-012018-08-01T00:00:002018-08-01T00:00:00+02:00

你的代码出了什么问题?

我无法复制您的IllegalArgumentException。在我的 Java 10 上,01082018 的前导 0 被接受(在 Java 8 上也是如此)。但是,数据类型工厂将字符串解析为 1082018 年(从现在起超过一百万年),并且由于字符串在那里结束,因此它没有解析任何月份或月份中的某天。所以生成的XMLGregorianCalendar 中只有一年,没有定义其他字段。

newXMLGregorianCalendar(String) 仅接受 XML 格式。显然只接受一年。格式仍然遵循此答案底部链接的规范。

不过,接受前导 0 可能是一个错误,因为根据 newXMLGregorianCalendar(String) 的文档,toXMLFormat 方法不会打印回前导零,该方法应该返回与解析时相同的字符串.

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2013-07-19
    • 1970-01-01
    • 2013-10-06
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多