Подтвердить что ты не робот

Преобразование между LocalDate и XMLGregorianCalendar

Какой лучший способ конвертировать между LocalDate из Java 8 и XMLGregorianCalendar?

4b9b3361

Ответ 1

Преобразование из LocalDate в XMLGregorianCalendar:

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 возникает из элемента nontimezoned xsd: date (представленного как YYYY-MM-DD в xml). В этом случае вы должны преобразовать его следующим образом:

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

Ответ 3

Для преобразования из 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();