Convert between LocalDate and XMLGregorianCalendar

前端 未结 4 1296
夕颜
夕颜 2020-12-08 13:05

What\'s the best way to convert between LocalDate from Java 8 and XMLGregorianCalendar?

相关标签:
4条回答
  • 2020-12-08 13:31

    To convert from LocalDate to XMLGregorianCalendar you can use

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

    And to convert XMLGregorianCalendar back to LocalDate:

    XMLGregorianCalendar xmlCal = ...;
    Date utilDate = xmlCal.toGregorianCalendar().getTime();
    LocalDate localDate = LocalDateTime.ofInstant( utilDate.toInstant(), ZoneId.systemDefault() ).toLocalDate();
    
    0 讨论(0)
  • 2020-12-08 13:32

    Converting from LocalDate to XMLGregorianCalendar:

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

    Converting back is simpler:

    xcal.toGregorianCalendar().toZonedDateTime().toLocalDate();
    
    0 讨论(0)
  • 2020-12-08 13:40

    The following is a simple way to convert from LocalDate to XMLGregorianCalendar which both preserves the undefined fields (hours, timezone, etc.) and is efficient (i.e. no conversion to/from String). Unlike some of the other solutions this results in XML dates without timezones, e.g. <date>2018-11-06</date> instead of <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());
    

    Converting back is a bit simpler:

    XMLGregorianCalendar xmlCal = ...
    LocalDate date = LocalDate.of(xmlCal.getYear(), xmlCal.getMonth(), xmlCal.getDay());
    
    0 讨论(0)
  • 2020-12-08 13:43

    The LocalDate stores only year/month/day information. There is no time nor time-zone information in it. The XMLGregorianCalendar stores date (year/month/day) + optionally time and optionally time zone information.

    So converting from LocalDate to XMLGregorianCalendar is simple:

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

    Converting from XMLGregorianCalendar to LocalDate might be not so simple, because XMLGregorianCalendar may have time and time-zone information which you simply can't store in LocalDate.

    However, I guess that if you are converting from XMLGregorianCalendar to LocalDate then the XMLGregorianCalendar is resulting from a nontimezoned xsd:date element (represented as YYYY-MM-DD in the xml). In that case you should convert it like this:

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

    Whole example:

        {
            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());
        }
    
    0 讨论(0)
提交回复
热议问题