How to compare XMLGregorianCalendar with only the Date portion (day, month, year)?

gregorian-calendar, java, jaxb, web-services, xsd

Solution

Instead of trying to clear out the unwanted fields from the `GregorianCalendar`, it may be easier to create an un-initialized `XMLGregorianCalendar` and then copy just the fields you do want:

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);

This avoids the round trip to String and back again that would be necessary if you were to use `newXMLGregorianCalendar(lexicalRepresentation)`

Problem

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?

Original source