在 LocalDate 和 XMLGregorianCalendar 之间转换
Convert between LocalDate and XMLGregorianCalendar
从 Java 8 和 XMLGregorianCalendar
转换 LocalDate
的最佳方法是什么?
要从 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
:
LocalDate date = LocalDate.now();
GregorianCalendar gcal = GregorianCalendar.from(date.atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
转换回来更简单:
xcal.toGregorianCalendar().toZonedDateTime().toLocalDate();
LocalDate 仅存储 year/month/day 信息。其中没有时间或时区信息。 XMLGregorianCalendar 存储日期 (year/month/day) + 可选 时间和可选 时区信息。
因此从 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 的简单方法,它既保留未定义的字段(小时、时区等)又高效(即不转换 to/from 字符串) .与其他一些解决方案不同,这会导致 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());
从 Java 8 和 XMLGregorianCalendar
转换 LocalDate
的最佳方法是什么?
要从 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
:
LocalDate date = LocalDate.now();
GregorianCalendar gcal = GregorianCalendar.from(date.atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
转换回来更简单:
xcal.toGregorianCalendar().toZonedDateTime().toLocalDate();
LocalDate 仅存储 year/month/day 信息。其中没有时间或时区信息。 XMLGregorianCalendar 存储日期 (year/month/day) + 可选 时间和可选 时区信息。
因此从 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 的简单方法,它既保留未定义的字段(小时、时区等)又高效(即不转换 to/from 字符串) .与其他一些解决方案不同,这会导致 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());