我正在开发与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
然后仅复制您do想要的字段可能会更容易:
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)
,则可以避免再次返回该方法>
[javadoc for XMLGregorianCalendar.compare解释说它使用rules from the XML Schema specification进行比较,与Javadoc链接。
UPDATE
尝试
[如果有人还在寻找替代方案。这符合我的要求。