我正在开发与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);

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

但我期望:
2013-02-20

如果使用日期( xgc )与 trxDate 进行比较:
int result = trxDate.compare(xgc);

结果为2,表示:INDETERMINATE(来自DatatypeConstants类)。正确的结果应为-1、0或1。

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

最佳答案

与其尝试从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);

这样可以避免往返String并再次返回,这在使用newXMLGregorianCalendar(lexicalRepresentation)时是必须的

10-05 23:40