从XMLGregorianCalendar转换为java.util.Date时精度损失

时间:2015-02-05 12:56:32

标签: java xml date

我编写了一个测试,将XMLGregorianCalendar日期转换为java.util.Date并返回。我的开始xml日期具有字符串值“2015-02-03T11:32:41.000755”,但在从java.util.Date转换回XMLGregorianCalendar之后,字符串值为“2015-02-03T11:32:41.000”。有没有人想改变代码,以便保留xml日期的最后3位数?

谢谢, 埃里克

以下是代码:

public class XMLCalendarTest {

    @Test
    public void testDateFormats() {

        try {
            // DateTime (yyyy-MM-dd'T'HH:mm:ss.SSSSSS)
            final String dateTimeText = "2015-02-03T11:32:41.000755";
            XMLGregorianCalendar xmlDateTime = DatatypeFactory.newInstance().newXMLGregorianCalendar(dateTimeText);
            Assert.assertEquals(dateTimeText, xmlDateTime.toXMLFormat());

            // after converting from Date the XML date is "2015-02-03T11:32:41.000" --> why?
            Assert.assertEquals(dateTimeText, createXMLDateTime(createDate(xmlDateTime)));

        } catch (DatatypeConfigurationException e) {
            e.printStackTrace();
        }
    }

    private XMLGregorianCalendar createXMLDateTime(final Date date) throws DatatypeConfigurationException {
        if (date == null) {
            return null;
        }

        final GregorianCalendar c = new GregorianCalendar();

        c.setTime(date);

         final XMLGregorianCalendar xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
         xmlCalendar.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

         return xmlCalendar;

    }

    private static Date createDate(final XMLGregorianCalendar xmlCalendar) {
        if (xmlCalendar != null) {
            return xmlCalendar.toGregorianCalendar().getTime();
        }
        return null;
    }
}

1 个答案:

答案 0 :(得分:2)

java.util.Date仅保持毫秒精度。

java.sql.TimeStamp具有纳秒精度。

我没有看到在XMLGregorianCalendar和TimeStamp之间进行转换的自动方式,但是getFractionalSeconds应该提供对所需精度级别的访问。