如何比较XMLGregorianCalendar只有Date部分(日,月,年)?

我正在开发一个集成了spring-struts web应用程序的web服务,在XSD中有一个XMLGregorianCalendar类型属性,假设属性名称为trxDate

在SOAPUI测试应用程序中,如果我插入了trxDate的值: 2013-02-21 ,那么我发送了soap xml请求数据,并在service方法中打印了值: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年2月20日

如果使用日期( xgc )与trxDate进行比较:

 int result = trxDate.compare(xgc); 

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

那我的代码有什么问题?

您可以更轻松地创建未初始化的XMLGregorianCalendar ,然后仅复制您想要的字段,而不是尝试从GregorianCalendar清除不需要的字段:

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

如果您使用newXMLGregorianCalendar(lexicalRepresentation) ,这将避免往返String并再次返回

XMLGregorianCalendar.compare的javadoc解释了它使用XML Schema规范中的规则进行比较,javadoc链接到这些规则 。

第B.1节。 比较算法表明两个dateTimes必须具有完全相同(子)的{year,month,day,hour,minute,second}字段集。 如果他们不这样做,结果是不确定的。 (XML Schema规范在算法描述中使用<>来指示不确定的结果。)

因此,如果您有一个仅定义年,月和日的XMLGregorianCalendar,则必须将其与另一个仅定义了年,月和日的XMLGregorianCalendar进行比较。 您必须像Blaise建议的那样从字符串中解析它,或者您必须实例化XMLGregorianCalendar并自己调用setYearsetMonthsetDay

UPDATE

您也可以这样创建XMLGregorianCalendar

  XMLGregorianCalendar xgc = df.newXMLGregorianCalendar( 2012, DatatypeConstants.FEBRUARY, 21, DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED); System.out.println(xgc); 

您可以使用以下方法:

  • newXMLGregorianCalendar(String lexicalRepresentation)

演示

 import javax.xml.datatype.*; public class Demo { public static void main(String[] args) throws Exception { DatatypeFactory df = DatatypeFactory.newInstance(); XMLGregorianCalendar xgc = df.newXMLGregorianCalendar("2013-02-12"); System.out.println(xgc); } } 

产量

 2013-02-12 

尝试

  String str = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(str); System.out.println(xgc); 

这是XMLGregorianCalendar的提示(顺序),使用xsd:date类型,其中时间未定义