10

I want to compute the delta of time, a subtraction, between two XmlGregorianCalendar objects, so as to create a Duration object.

But I haven't found clean ways of performing that subtraction. How would you do it?

entpnerd
  • 9,041
  • 5
  • 41
  • 66
Stephane Rolland
  • 37,098
  • 33
  • 115
  • 165

2 Answers2

13

That should be:

DatatypeFactory.newDuration(xgc2.toGregorianCalendar().getTimeInMillis() - xgc1.toGregorianCalendar().getTimeInMillis())
Jerome
  • 8,339
  • 2
  • 31
  • 41
1

The accepted answer only gives the results in millis resolution but XmlGregorianCalendar allows infinite precision. We had to solve the problem for µS resolution. I did it by converting to big decimal and using getFractionalSeconds. see below

 public static BigDecimal convertXMLGregorianToSecondsAndFractionalSeconds(XMLGregorianCalendar xgc){
    long ms = xgc.toGregorianCalendar().getTimeInMillis();
    long secs = ms / 1000l;
    BigDecimal decValue = BigDecimal.valueOf(secs);
    BigDecimal fracSects = xgc.getFractionalSecond();
    decValue = decValue.add(fracSects);
    return decValue;
}

 @Test
public void testSubtraction() throws Exception {
    XMLGregorianCalendar xgc1 =  DatatypeFactory.newInstance().newXMLGregorianCalendar("2015-05-22T16:28:40.317123-04:00");
    XMLGregorianCalendar xgc2 =  DatatypeFactory.newInstance().newXMLGregorianCalendar("2015-05-22T16:28:40.917124-04:00");
    BigDecimal bd1 = MathUtils.convertXMLGregorianToSecondsAndFractionalSeconds(xgc1);
    BigDecimal bd2 = MathUtils.convertXMLGregorianToSecondsAndFractionalSeconds(xgc2);
    BigDecimal result = bd2.subtract(bd1);
    Assert.assertTrue(result.equals(new BigDecimal("0.600001")));
}  
TT.
  • 15,428
  • 6
  • 44
  • 84
Jeff Gaer
  • 313
  • 2
  • 13