2013-11-03 55 views
0

java.sql.Timestamp轉換爲javax.xml.datatype.XMLGregorianCalendar的最簡潔方法是什麼?將java.sql.Timestamp轉換爲javax.xml.datatype.XMLGregorianCalendar而不丟失納米

鑑於XMLGregorianCalendar具有BigDecimal精度小數秒沒有失去精度,但是我不知道什麼時候我區應設置在考慮到java.sql.Timestamp是時區獨立XMLGregorianCalendar對象。

有對等how to convert java.util.Date to XMLGregorianCalendar,所以我可以投我Timestampjava.util.Date但這樣會導致精度在亞毫秒範圍損失,這是不必要的,因爲目標數據類型(XMLGregorianCalendar)的答案可以容納的納秒組件源數據類型(Timestamp)。

回答

0

java.sql.Timestamp保存自1970年1月1日以來的毫秒數,格林威治標準時間00:00:00 GMT/UTC +納米。因此,除非你在做任何事情,我建議based on the XMLGregorianCalendar docs你設置時區爲0(UTC)。

1

我做這樣說:

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 
相關問題