I'm developing a webservice integrated with spring-struts web application, in XSD there is a XMLGregorianCalendar type property, let's say the property name is trxDate.
In SOAPUI testing application, if I inserted the value of trxDate with: 2013-02-21, then I sent the soap xml request data and I printed the value in service method with: System.out.println(trxDate) method, the printout result is same as inputted: 2013-02-21.
Now, I'm trying to create a function to compare trxDate with current date. I know we can compare it using trxDate.compare(currentDate) method. The problem is I don't how to create XMLGregorianCalendar object set with current date with Date portion only (day, month, and year) to be used for comparing.
I tried with this code:
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);
The result is:
2013-02-20T00:00:00.000+07:00
But I'm expecting:
2013-02-20
If use the date (xgc) to compare with trxDate:
int result = trxDate.compare(xgc);
The result is 2, which means: INDETERMINATE (from DatatypeConstants class). The proper result should be -1, 0, or 1.
So what's wrong with my code?
The javadoc for XMLGregorianCalendar.compare explains that it uses the rules from the XML Schema specification for the comparison, to which the javadoc links.
Section B.1. of the comparison algorithm states that both dateTimes must have exactly the same (sub)set of {year, month, day, hour, minute, second} fields defined. If they don't, the result is indeterminate. (The XML Schema spec uses <>
in the algorithm description to indicate an indeterminate result.)
So if you have an XMLGregorianCalendar with just year, month and day defined, you must compare it with another XMLGregorianCalendar with just year, month and day defined. Either you must parse it from a string, as Blaise suggested, or you must instantiate an XMLGregorianCalendar and call setYear
, setMonth
and setDay
on it yourself.