如何将 XMLGregorianCalendar 与仅日期部分(日、月、年)进行比较?

nul*_*ull 4 java xsd web-services jaxb gregorian-calendar

我正在开发一个与 spring-struts Web 应用程序集成的 Web 服务,在 XSD 中有一个 XMLGregorianCalendar 类型属性,假设属性名称是trxDate

在 SOAPUI 测试应用程序中,如果我插入了 trxDate 的值:2013-02-21,那么我发送了soap xml请求数据,并使用以下方法在服务方法中打印了该值: System.out.println(trxDate) 方法,打印输出结果与输入相同:2013-02-21。

现在,我正在尝试创建一个函数来将trxDate与当前日期进行比较。我知道我们可以使用 trxDate.compare(currentDate) 方法进行比较。问题是我不知道如何创建使用当前日期设置的 XMLGregorianCalendar 对象,仅使用日期部分(日、月和年)进行比较。

我尝试使用以下代码:

    GregorianCalendar gc = new GregorianCalendar();
    gc.set(GregorianCalendar.HOUR_OF_DAY, 0);
    gc.set(GregorianCalendar.MINUTE, 0);
    gc.set(GregorianCalendar.SECOND, 0);
    gc.set(GregorianCalendar.MILLISECOND, 0);

    XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
    System.out.println(xgc);
Run Code Online (Sandbox Code Playgroud)

结果是:
2013-02-20T00:00:00.000+07:00

但我期待:
2013-02-20

如果使用日期(xgc )与trxDate进行比较:

int result = trxDate.compare(xgc);
Run Code Online (Sandbox Code Playgroud)

结果是 2,这意味着:INDETERMINATE(来自 DatatypeConstants 类)。正确的结果应该是 -1、0 或 1。

那么我的代码有什么问题吗?

Ian*_*rts 5

与其尝试从 中清除不需要的字段GregorianCalendar,不如创建一个未初始化的字段,然后仅复制您想要的字段可能会XMLGregorianCalendar容易:

XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar();
GregorianCalendar now = new GregorianCalendar();
xgc.setYear(now.get(Calendar.YEAR));
xgc.setMonth(now.get(Calendar.MONTH) + 1);
xgc.setDay(now.get(Calendar.DAY_OF_MONTH));
System.out.println(xgc);
Run Code Online (Sandbox Code Playgroud)

这可以避免往返 String 并再次返回,如果您要使用的话,这是必要的newXMLGregorianCalendar(lexicalRepresentation)