java.sql.Timestamp转换为最干净的方法是什么javax.xml.datatype.XMLGregorianCalendar?
鉴于它XMLGregorianCalendar具有BigDecimal小数秒的精度,因此不会损失精度,但是我不确定应该在与时区无关的XMLGregorianCalendar对象上设置哪个时区。java.sql.Timestamp
SO 有一个关于如何转换java.util.DateXMLGregorianCalendar为的答案,以便我可以将其转换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);
}
}
Run Code Online (Sandbox Code Playgroud)
该示例输出:
Timestamp::2015-08-25 20:59:35.123456789
Calendar:::2015-08-25T20:59:35.123456789
Run Code Online (Sandbox Code Playgroud)