在LocalDate和XMLGregorianCalendar之间转换

时间:2015-04-21 08:42:02

标签: java java-8 converter java-time

在Java 8和LocalDate之间转换XMLGregorianCalendar的最佳方法是什么?

4 个答案:

答案 0 :(得分:79)

LocalDate转换为XMLGregorianCalendar

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

转换回来比较简单:

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

答案 1 :(得分:11)

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());
    }

答案 2 :(得分:5)

要从LocalDate转换为XMLGregorianCalendar,您可以使用

LocalDate localDate = ...;
GregorianCalendar calender = new GregorianCalendar();
Date utilDate = Date.from( localDate.atStartOfDay( ZoneId.systemDefault() ).toInstant() );
calender.setTime(utilDate);     
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);

要将XMLGregorianCalendar转换回LocalDate

XMLGregorianCalendar xmlCal = ...;
Date utilDate = xmlCal.toGregorianCalendar().getTime();
LocalDate localDate = LocalDateTime.ofInstant( utilDate.toInstant(), ZoneId.systemDefault() ).toLocalDate();

答案 3 :(得分:3)

以下是从LocalDate转换为XMLGregorianCalendar的简单方法,该方法既保留了未定义的字段(小时,时区等),又非常有效(即,没有到/从String的转换)。与其他一些解决方案不同,这导致XML日期没有时区,例如<date>2018-11-06</date>而不是<date>2018-11-06+01:00</date>

LocalDate date = ...;
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar();
xmlCal.setYear(date.getYear());
xmlCal.setMonth(date.getMonthValue());
xmlCal.setDay(date.getDayOfMonth());

向后转换比较简单:

XMLGregorianCalendar xmlCal = ...
LocalDate date = LocalDate.of(xmlCal.getYear(), xmlCal.getMonth(), xmlCal.getDay());