You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成仅保留年份的XMLGregorianCalendar类型对象

实现方案

你之前的实现问题在于:通过new GregorianCalendar()初始化XMLGregorianCalendar时,会自动填充当前系统的月、日、时间、时区等值,仅修改年份不会清空其他字段,因此序列化后会返回完整时间戳。

你可以通过以下三种方式生成仅包含年份的XMLGregorianCalendar对象:

方式1:初始化空实例后仅设置年份

初始化空实例的所有字段默认处于未定义状态,仅手动设置年份即可:

import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar();
xmlCal.setYear(2021);
xmlObject.setBuiltYear(xmlCal);

方式2:解析年份字符串直接生成

直接传入符合ISO8601规范的年份字符串生成实例,会自动仅保留年份字段:

XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar("2021");
xmlObject.setBuiltYear(xmlCal);

方式3:清空已有实例的非年份字段

如果你已经基于GregorianCalendar初始化了实例,可以手动将其他字段设为未定义状态:

import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.GregorianCalendar;

XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
xmlCal.setYear(2021);
// 清空其他所有非必要字段
xmlCal.setMonth(DatatypeConstants.FIELD_UNDEFINED);
xmlCal.setDay(DatatypeConstants.FIELD_UNDEFINED);
xmlCal.setHour(DatatypeConstants.FIELD_UNDEFINED);
xmlCal.setMinute(DatatypeConstants.FIELD_UNDEFINED);
xmlCal.setSecond(DatatypeConstants.FIELD_UNDEFINED);
xmlCal.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
xmlCal.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

xmlObject.setBuiltYear(xmlCal);

以上三种方式生成的XMLGregorianCalendar实例序列化后只会输出年份值,类型完全符合JAXB属性要求。


内容的提问来源于stack exchange,提问作者VKP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:48:05