我正在开发与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)
时是必须的