1. 概述

在本篇教程中,我们将简要介绍 LocalDateXMLGregorianCalendar 这两个类,并通过示例展示它们之间的相互转换方式。

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. 总结

本文简单介绍了 LocalDateXMLGregorianCalendar 之间的互转方法:

  • ✅ 使用 DatatypeFactory 实现 LocalDateXMLGregorianCalendar 的转换
  • ✅ 直接提取年月日即可完成反向转换
  • ⚠️ 需要注意两者在时区和时间精度上的差异

完整代码示例可以在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-datetime-conversion


原始标题:Converting Between LocalDate and XMLGregorianCalendar