【问题标题】:How do I subtract two XmlGregorianCalendar objects to create one Duration object?如何减去两个 XmlGregorianCalendar 对象来创建一个 Duration 对象?
【发布时间】:2012-05-18 14:55:09
【问题描述】:

我想计算两个XmlGregorianCalendar对象之间的时间差,一个减法,从而创建一个Duration对象。

但我还没有找到执行减法的干净方法。你会怎么做?

【问题讨论】:

  • 这是你不使用 Joda 时间所付出的代价...

标签: java


【解决方案1】:

接受的答案仅以毫秒分辨率给出结果,但 XmlGregorianCalendar 允许无限精度。我们必须解决 µS 分辨率的问题。我通过转换为大十进制并使用 getFractionalSeconds 来做到这一点。见下文

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

【讨论】:

    【解决方案2】:

    应该是:

    DatatypeFactory.newDuration(xgc2.toGregorianCalendar().getTimeInMillis() - xgc1.toGregorianCalendar().getTimeInMillis())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-20
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 2011-01-12
      • 2018-10-10
      • 2019-07-19
      相关资源
      最近更新 更多