簡體   English   中英

在LocalDate和XMLGregorianCalendar之間轉換

[英]Convert between LocalDate and XMLGregorianCalendar

在Java 8和XMLGregorianCalendar之間轉換LocalDate的最佳方法是什么?

LocalDate轉換為XMLGregorianCalendar

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

轉換回來比較簡單:

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

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是由非時間化的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());
    }

要從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();

以下是從LocalDate轉換為XMLGregorianCalendar的簡單方法,它既保留未定義的字段(小時,時區等)又高效(即不轉換為/來自String)。 與其他一些解決方案不同,這導致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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM