java.sql.Timestamp转换为javax.xml.datatype.XMLGregorianCalendar的最干净方法是什么?

鉴于XMLGregorianCalendar在小数秒内具有BigDecimal精度,因此不会损失精度,但是由于XMLGregorianCalendar与时区无关,因此我不确定应在java.sql.Timestamp对象上设置哪个时区。

how to convert java.util.Date to XMLGregorianCalendar上有关于SO的答案,因此我可以将Timestamp强制转换为java.util.Date,但这将导致精度在亚毫秒范围内损失,这是不必要的,因为目标数据类型(XMLGregorianCalendar)可以容纳源数据类型(Timestamp)的纳秒分量。

最佳答案

我这样做:

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class ApiRuntime {

    public static void main(String[] args) throws Exception {

        Timestamp ts = new Timestamp(new Date().getTime());
        ts.setNanos(123456789);

        LocalDateTime ldt = ts.toLocalDateTime();

        XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar();

        cal.setYear(ldt.getYear());
        cal.setMonth(ldt.getMonthValue());
        cal.setDay(ldt.getDayOfMonth());
        cal.setHour(ldt.getHour());
        cal.setMinute(ldt.getMinute());
        cal.setSecond(ldt.getSecond());
        cal.setFractionalSecond(new BigDecimal("0." + ldt.getNano()));

        System.out.println("Timestamp::" + ts);
        System.out.println("Calendar:::" + cal);
    }
}


该示例输出:

Timestamp::2015-08-25 20:59:35.123456789
Calendar:::2015-08-25T20:59:35.123456789

09-05 00:39