2012-10-12 13 views
7

ミリ秒のタイムスタンプをXMLGregorianCalendarに変換しようとしていますが、間違った結果が出ているようです。私は何か間違っているのですか?私は日々を得ているようだ。Long to XMLGregorianCalendarとLongに戻る

// Time stamp 01-Jan-0001 00:00:00.000 
    Long ts = -62135740800000L; 
    System.out.println(ts); 
    System.out.println(new Date(ts)); // Sat Jan 01 00:00:00 PST 1 .. Cool! 

    // to Gregorian Calendar 
    GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTimeInMillis(ts); 

    // to XML Gregorian Calendar 
    XMLGregorianCalendar xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); 

    // back to GC 
    GregorianCalendar gc2 = xc.toGregorianCalendar(); 

    // to Timestamp 
    Long newTs = gc2.getTimeInMillis(); 
    System.out.println(newTs); // -62135568000000 .. uh? 
    System.out.println(new Date(newTs)); // Mon Jan 03 00:00:00 PST 1 .. where did the extra days come from? 

答えて

0

私はここに問題があると思います。ドキュメントごとに、toGregorianCalendar()は、フィールドがない場合に変換に対応するデフォルトのGregorianCalendarに依存しています。

あなたがしようとした場合:

Date date = new Date(); 
long ts = date.getTime(); //in place of your input 

をし、あなたのコードを実行して、あなたは、細かい作業の両方tofrom変換を見つける必要があります。

例のようにtoGregorianCalendar()にカスタム入力を入力したい場合は、toGregorianCalendar(TimeZone,Locale,Defaults)を使用して、変換に使用する最新のデフォルトを指定してください。

3

興味深いことに、(約)-10000000000000L(および正の値)までの値で問題なく機能しますが、負の値が大きくなると不一致になります。

あなたがgcxc、およびgc2をプリントアウトした場合、問題が発生した場合は、あなたが見ることができる(たXMLGregorianCalendarからの変換のGregorianCalendar

gc: java.util.GregorianCalendar[time=-62135740800000 ... DAY_OF_WEEK=7 
xc: 0001-01-01T08:00:00.000Z 
gc2: java.util.GregorianCalendar[time=? ... DAY_OF_WEEK=5 

あなたがxcのフィールドを印刷する場合は、1,1を取得します(ヶ月のGregorianCalendarにゼロベースであるため、xc一致する)、1。

System.out.println(xc.getYear()); 
    System.out.println(xc.getMonth()); 
    System.out.println(xc.getDay()); 

gc2について、あなたは,0,1を取得します

System.out.println(gc2.get(gc2.YEAR)); 
    System.out.println(gc2.get(gc2.MONTH)); 
    System.out.println(gc2.get(gc2.DAY_OF_MONTH)); 
ただし、これらの3つを追加すると、の出力が変更されます。 - time=?の出力が gc2から time=-62135568000000に変更されました。 - GregorianCalendarオブジェクトを照会すると計算が開始されました。 areFieldsSetプロパティも falseから trueに変更されます。

2つのGregorianCalendarsのタイムゾーンは異なりますが、明示的なTimeZoneとLocaleを設定してもこのエラーは発生しません。

+0

'gc2.get(GregorianCalendar.YEAR);を追加すると、その日は正しいが、今年の年は1969年だけオフになる。 –

+0

それは奇妙です - 私はそれを見ません!日は間違っていて、年はまだ1です。Javaのバージョン(1.6.0_27を使用しています)またはロケール(私は 'en_GB')のバージョンに依存しているのでしょうか? – DNA

関連する問題