web-dev-qa-db-ja.com

LocalDateとXMLGregorianCalendar間の変換

Java 8からLocalDateXMLGregorianCalendarの間で変換する最良の方法は何ですか?

45
maja

LocalDateからXMLGregorianCalendarへの変換:

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

逆変換は簡単です:

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

LocalDateは年/月/日の情報のみを保存します。時間もタイムゾーン情報もありません。 XMLGregorianCalendarは、日付(年/月/日)+ オプション時間およびオプションタイムゾーン情報を保存します。

したがって、LocalDateからXMLGregorianCalendarへの変換は簡単です。

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

XMLGregorianCalendar mayには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());
    }
12
riskop

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

XMLGregorianCalendarLocalDateに戻すには:

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

以下は、LocalDateからXMLGregorianCalendarに変換する簡単な方法です。XMLGregorianCalendarは、未定義のフィールド(時間、タイムゾーンなど)を保持し、効率的です(つまり、文字列への/からの変換なし)。他のソリューションの一部とは異なり、これによりタイムゾーンのない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());
3
Acanda