web-dev-qa-db-fra.com

Convertir entre LocalDate et XMLGregorianCalendar

Quelle est la meilleure façon de convertir entre LocalDate de Java 8 et XMLGregorianCalendar?

45
maja

Conversion de LocalDate en XMLGregorianCalendar:

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

La conversion est plus simple:

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

LocalDate ne stocke que les informations année/mois/jour. Il n'y a aucune information de fuseau horaire ou de fuseau horaire. Le XMLGregorianCalendar stocke la date (année/mois/jour) + éventuellement heure et facultatif informations de fuseau horaire.

Donc, convertir de LocalDate en XMLGregorianCalendar est simple:

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

La conversion de XMLGregorianCalendar en LocalDate n'est peut-être pas si simple, car XMLGregorianCalendar may contient des informations sur l'heure et le fuseau horaire que vous ne pouvez tout simplement pas stocker dans LocalDate.

Cependant, je suppose que si vous convertissez de XMLGregorianCalendar à LocalDate, XMLGregorianCalendar est le résultat d'un élément xsd: date non optimisé (représenté par YYYY-MM-DD dans xml). Dans ce cas, vous devriez le convertir comme ceci:

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

Exemple entier:

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

Pour convertir de LocalDate en XMLGregorianCalendar, vous pouvez utiliser

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

Et pour convertir XMLGregorianCalendar en LocalDate:

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

Ce qui suit est un moyen simple de convertir LocalDate en XMLGregorianCalendar, qui préserve les champs non définis (heures, fuseau horaire, etc.) et est efficace (c'est-à-dire, aucune conversion vers/depuis String). Contrairement à d'autres solutions, il en résulte des dates XML sans fuseau horaire, par exemple. <date>2018-11-06</date> au lieu de <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());

La conversion est un peu plus simple:

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