1. 概述
在本快速教程中,我们将讨论LocalDate和XMLGregorianCalendar,并提供两种类型之间转换的示例。
2. XMLGregorianCalendar
XML Schema标准定义了以XML格式指定日期的明确规则,为了使用此格式,Java 1.5中引入了XMLGregorianCalendar类,它是W3C XML Schema 1.0日期/时间数据类型的表示。
3. LocalDate
LocalDate实例表示ISO-8601日历系统中不带时区的日期,因此,LocalDate适合存储生日等数据,但不适合存储任何与时间相关的数据。Java在1.8版本中引入了LocalDate。
4. 从LocalDate到XMLGregorianCalendar
首先,我们来看看如何将LocalDate转换为XMLGregorianCalendar。为了生成一个新的XMLGregorianCalendar实例,我们使用了javax.xml.datatype包中的DataTypeFactory。
因此,让我们创建一个LocalDate实例并将其转换为XMLGregorianCalendar:
LocalDate localDate = LocalDate.of(2019, 4, 25);
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(localDate.toString());
assertThat(xmlGregorianCalendar.getYear()).isEqualTo(localDate.getYear());
assertThat(xmlGregorianCalendar.getMonth()).isEqualTo(localDate.getMonthValue());
assertThat(xmlGregorianCalendar.getDay()).isEqualTo(localDate.getDayOfMonth());
assertThat(xmlGregorianCalendar.getTimezone()).isEqualTo(DatatypeConstants.FIELD_UNDEFINED);
如前所述,XMLGregorianCalendar实例可能包含时区信息。然而,LocalDate不包含任何时间信息。
因此,当我们执行转换时,时区值将保持为FIELD_UNDEFINED。
5. 从XMLGregorianCalendar到LocalDate
同样,我们现在来看看如何反过来进行转换。事实证明,从XMLGregorianCalendar转换为LocalDate要容易得多。
同样,由于LocalDate没有有关时间的信息,因此LocalDate实例只能包含XMLGregorianCalendar信息的子集。
让我们创建一个XMLGregorianCalendar实例并执行转换:
XMLGregorianCalendar xmlGregorianCalendar =
DatatypeFactory.newInstance().newXMLGregorianCalendar("2019-04-25");
LocalDate localDate = LocalDate.of(
xmlGregorianCalendar.getYear(),
xmlGregorianCalendar.getMonth(),
xmlGregorianCalendar.getDay());
assertThat(localDate.getYear()).isEqualTo(xmlGregorianCalendar.getYear());
assertThat(localDate.getMonthValue()).isEqualTo(xmlGregorianCalendar.getMonth());
assertThat(localDate.getDayOfMonth()).isEqualTo(xmlGregorianCalendar.getDay());
6. 总结
在本快速教程中,我们介绍了LocalDate实例和XMLGregorianCalendar之间的转换。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章
