1. 概述
在本篇教程中,我们将简要介绍 LocalDate
和 XMLGregorianCalendar
这两个类,并通过示例展示它们之间的相互转换方式。
2. XMLGregorianCalendar 简介
XML Schema 标准对 XML 中日期格式的表示有明确规范。为了支持这种格式,Java 1.5 引入了 XMLGregorianCalendar
类,它是 W3C XML Schema 1.0 日期/时间数据类型 的一种实现。
✅ 适用于处理 XML 数据中的时间字段
⚠️ 注意它支持时区信息,而 LocalDate
不支持
3. LocalDate 简介
LocalDate
是 Java 8 新增的时间 API 中的一个类,表示 ISO-8601 日历系统下的一个日期(不含时区)。因此,它适合用于存储生日等不涉及具体时间的数据。
❌ 不适合需要精确到时分秒的场景
✅ 轻量、线程安全、易于使用
4. 将 LocalDate 转换为 XMLGregorianCalendar
我们首先来看如何将 LocalDate
转换为 XMLGregorianCalendar
。这个过程需要用到 javax.xml.datatype.DatatypeFactory
来创建 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);
📌 踩坑提示:由于 LocalDate
没有时区信息,所以在转换后,XMLGregorianCalendar
的时区字段会被设置为 FIELD_UNDEFINED
。
5. 将 XMLGregorianCalendar 转换为 LocalDate
反过来的操作就简单多了。因为 LocalDate
只关心年月日,我们可以直接从 XMLGregorianCalendar
提取这些字段来构造 LocalDate
对象。
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());
📌 注意:如果原始 XMLGregorianCalendar
包含时间或时区信息,在转换为 LocalDate
时会被忽略。
6. 总结
本文简单介绍了 LocalDate
与 XMLGregorianCalendar
之间的互转方法:
- ✅ 使用
DatatypeFactory
实现LocalDate
到XMLGregorianCalendar
的转换 - ✅ 直接提取年月日即可完成反向转换
- ⚠️ 需要注意两者在时区和时间精度上的差异
完整代码示例可以在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-datetime-conversion