【问题标题】:How get only year with type XMLGregorianCalendar如何仅使用 XMLGregorianCalendar 类型获取年份
【发布时间】:2021-11-16 23:16:38
【问题描述】:

我有一个使用 XMLGregorianCalendar 类型设置的 XML Jaxb 类。但是我们应该在这个属性中只设置年份。

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 的年份。我们该怎么做?

【问题讨论】:

  • 按照您的方式设置年份就足够了。 XSD 类型应该是一年,因此将其转换为 XML 应该省略其他字段。
  • 但在 XSD 中它的 XMLGregorianCalendar 我无法更改
  • 不,不是。 XSD 不是 Java,它是生成此 Java 代码并用于将其映射回来的描述符。我强烈建议阅读 XSD 是什么。 XML 中的所有日期/时间类型(没有类型转换器)最终将作为XMLGregorianCalendar。像现在这样设置,JAXB最终应该只输出日期。

标签: java spring xmlgregoriancalendar


【解决方案1】:

在设置年份之前使用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

ONLINE DEMO

【讨论】:

  • 谢谢你的作品
  • 我建议你使用无参数工厂方法:XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar();。这会为您提供一个 XMLGregorianCalendar,其中所有字段未定义或 null,因此您不需要 clear()
【解决方案2】:

Arvind Kumar Avinash 的回答很好而且正确。还有其他方法可以获得相同的,所以作为补充,我介绍了一对。

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

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

输出:

2021

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

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

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

结果和以前一样。我设置未定义的字段是月份、日期和 UTC 偏移量(称为 timezoneXMLGregorianCalendar)。

一个更短的变体是:

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多