在 LocalDate 和 XMLGregorianCalendar 之间转换

2022-08-31 16:19:06

从 Java 8 到 ?LocalDateXMLGregorianCalendar


答案 1

从 转换为 :LocalDateXMLGregorianCalendar

LocalDate date = LocalDate.now();
GregorianCalendar gcal = GregorianCalendar.from(date.atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);

转换回来更简单:

xcal.toGregorianCalendar().toZonedDateTime().toLocalDate();

答案 2

LocalDate 仅存储年/月/日信息。其中没有时间或时区信息。XMLGregorianCalendar 存储日期(年/月/日)+ 可选时间和可选时区信息。

因此,从LocalDate转换为XMLGregorianCalendar很简单:

LocalDate in;
XMLGregorianCalendar out;
in = LocalDate.parse("1999-11-11");
out = DatatypeFactory.newInstance().newXMLGregorianCalendar(in.toString());

从 XMLGregorianCalendar 转换为 LocalDate 可能并不那么简单,因为 XMLGregorianCalendar 可能具有您根本无法存储在 LocalDate 中的时间和时区信息。

但是,我猜想,如果您要从 XMLGregorianCalendar 转换为 LocalDate,则 XMLGregorianCalendar 是由非时间分区的 xsd:date 元素(在 xml 中表示为 YYYY-MM-DD)生成的。在这种情况下,您应该像这样转换它:

XMLGregorianCalendar in;
LocalDate out;
in = DatatypeFactory.newInstance().newXMLGregorianCalendar("2011-11-11");
out = LocalDate.parse(in.toXMLFormat());

整个示例:

    {
        LocalDate in;
        XMLGregorianCalendar out;
        in = LocalDate.parse("1999-11-11");
        out = DatatypeFactory.newInstance().newXMLGregorianCalendar(in.toString());
        System.out.println("in: " + in.toString());
        System.out.println("out: " + out.toXMLFormat());
    }
    {
        XMLGregorianCalendar in;
        LocalDate out;
        in = DatatypeFactory.newInstance().newXMLGregorianCalendar("2011-11-11");
        out = LocalDate.parse(in.toXMLFormat());
        System.out.println("in: " + in.toXMLFormat());
        System.out.println("out: " + out.toString());
    }

推荐