Какой лучший способ конвертировать между LocalDate
из Java 8 и XMLGregorianCalendar
?
Преобразование между LocalDate и XMLGregorianCalendar
Ответ 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();