如何仅将XMLGregorianCalendar与Date部分(日,月,年)进行比较?

问题描述 投票:3回答:5

我正在开发与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。

那么我的代码怎么了?

java web-services xsd jaxb gregorian-calendar
5个回答
4
投票

而不是尝试从GregorianCalendar中清除不需要的字段,创建未初始化的XMLGregorianCalendar然后仅复制您do想要的字段可能会更容易:

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),则可以避免再次返回该方法>


4
投票

[javadoc for XMLGregorianCalendar.compare解释说它使用rules from the XML Schema specification进行比较,与Javadoc链接。


2
投票

UPDATE


0
投票

尝试


0
投票

[如果有人还在寻找替代方案。这符合我的要求。

© www.soinside.com 2019 - 2024. All rights reserved.