如何比较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并自己调用setYear
, setMonth
和setDay
。
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
类型,其中时间未定义