1

に変換する最もクリーンな方法は何java.sql.Timestampですかjavax.xml.datatype.XMLGregorianCalendar?

XMLGregorianCalendar小数秒の精度があることを考えると、BigDecimal精度が失われることはありませんが、タイムゾーンに依存しXMLGregorianCalendarないオブジェクトにどのタイムゾーンを設定する必要があるかわかりません。java.sql.Timestamp

SO に変換する方法java.util.Dateに関するXMLGregorianCalendar回答があるので、Timestampにキャストできますが、ターゲット データ型 ( ) がソース データ型のナノ秒コンポーネントを保持できるため、java.util.Date不要なサブミリ秒範囲の精度が失われます( )。XMLGregorianCalendarTimestamp

4

3 に答える 3

4

私はこのようにしています:

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
于 2015-08-25T19:00:48.337 に答える
0

java.sql.Timestamp1970 年 1 月 1 日 00:00:00 GMT/UTC + ナノ秒からのミリ秒数を保持します。したがって、その間に何か気の利いたことをしていない限り、XMLGregorianCalendar のドキュメントに基づいて、タイムゾーンを 0 (UTC) に設定することをお勧めします。

于 2013-11-03T20:02:52.943 に答える