如何生成仅保留年份的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
相关产品推荐
相关产品推荐

