如何使用XMLGregorianCalendar类型获取年份



我有一个XML Jaxb类要设置为XMLGregorianCalendar类型。但是我们应该在这个属性中只设置year。

XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(new 
GregorianCalendar());
xmlCal.setYear(2021);
xmlObject.setBuiltYear(xmlCal); 
// xmlCal.getYear() will give me year but its type int , so setter method not accepting it. If 
has to be of type XMLGregorianCalendar  only with year.

如果我像上面一样设置它,它给出2021-09-23T10:19:38.346-04:00,但我只需要使用XMLGregorianCalendar类型的年份。我们怎样才能做到呢?

在设置年份之前使用XMLGregorianCalendar#clear

演示:

import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
public class Main {
public static void main(String[] args) throws DatatypeConfigurationException {
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
xmlCal.clear();
xmlCal.setYear(2021);
System.out.println(xmlCal);
}
}

输出:

2021
<<p>在线演示/kbd>

Arvind Kumar Avinash的回答很好,也很正确。还有其他方法可以获得相同的效果,因此,作为补充,我将介绍两种方法。

编辑:Arvind Kumar Avinash编写的更简单、更短的代码变体:

XMLGregorianCalendar xmlCal
= DatatypeFactory.newInstance().newXMLGregorianCalendar();
xmlCal.setYear(2021);
System.out.println(xmlCal);

输出:

2021年

无参数newXMLGregorianCalendar()给我们一个所有字段未定义的XMLGregorianCalendarnull。设置年份,我们就完成了。

您也可以直接从工厂方法调用中创建完全完整的XMLGregorianCalendar。这是一个较长的变体:

XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance()
.newXMLGregorianCalendarDate(2021, DatatypeConstants.FIELD_UNDEFINED,
DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);

结果与之前相同。我设置未定义的字段是月份,月份的日期和UTC偏移量(与XMLGregorianCalendar一起称为时区)。

一个更短的变体是:

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

输出仍然是期望的:

2021年

就像你想要一个XMLGregorianCalendar来生成一个特定的字符串一样,XMLGregorianCalendar也可以从你想要的字符串中构造。

如果你的年份是int,你可以先转换:

int year = 2021;
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(String.valueOf(year));

int转换为String只是为了再次解析它可能感觉像是浪费。你决定。

选择哪一种方式?这是个品位问题。

java.time.Year

顺便说一句,只有当你的类需要一个XMLGregorianCalendar时,才使用那个类。对于所有其他用途,我推荐Year类:
Year year = Year.of(2021);
System.out.println(year);
2021年

最新更新