9

ミリ秒のタイムスタンプから XMLGregorianCalendar に変換しようとしていますが、間違った結果が得られているようです。私は何か間違ったことをしていますか?日数が増えているようです。

    // 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?
4

2 に答える 2

4

興味深い - (約) -10000000000000L (および正の値) までの値に対しては正常に機能しますが、負の値が大きくなると一貫性がなくなります。

、、および を出力すると、gcどこで問題が発生したかがわかります (XMLGregorianCalendar から GregorianCalendar への変換xcgc2

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,1 が得られます。

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

の場合gc2、1,0,1 を取得します (xcグレゴリオ暦では月はゼロから始まるため、これは に一致します)。

    System.out.println(gc2.get(gc2.YEAR));
    System.out.println(gc2.get(gc2.MONTH));
    System.out.println(gc2.get(gc2.DAY_OF_MONTH));

ただし、これらの 3 つの呼び出しを追加printlnすると、出力が印刷から変更されgc2ます。-time=?からの出力が- にgc2変更されたため、オブジェクトtime=-62135568000000のクエリによって何らかの計算がトリガーされました。プロパティも から に変更さGregorianCalendarれます。areFieldsSetfalsetrue

2 つの GregorianCalendars のタイムゾーンは異なりますが、これはエラーの原因ではなく、明示的な TimeZone と Locale を設定してもエラーは持続します。

于 2012-10-12T21:38:24.903 に答える
-1

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

試してみると:

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

コードを実行すると、変換tofrom変換の両方が正常に機能していることがわかります。

toGregorianCalendar()例のようにカスタム提供の入力が必要な場合toGregorianCalendar(TimeZone,Locale,Defaults)は、変換に使用される更新されたデフォルトを使用して提供してください。

于 2012-10-12T21:33:05.817 に答える