10

XmlGregorianCalendarオブジェクトを作成するために、2つのオブジェクト間の時間のデルタ(減算)を計算したいと思いDurationます。

しかし、私はその減算を実行するためのクリーンな方法を見つけていません。どうしますか?

4

2 に答える 2

13

それは次のようになります。

DatatypeFactory.newDuration(xgc2.toGregorianCalendar().getTimeInMillis() - xgc1.toGregorianCalendar().getTimeInMillis())
于 2012-05-18T16:28:39.527 に答える
1

受け入れられた答えはミリ単位の解像度でのみ結果を返しますが、XmlGregorianCalendar は無限の精度を許可します。µS 分解能の問題を解決する必要がありました。大きな 10 進数に変換し、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")));
}  
于 2020-08-12T11:33:55.180 に答える