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, xc, 和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,1。

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

对于gc2,您会得到 1,0,1(匹配xc,因为在 GregorianCalendar 中月份从零开始)

    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=?输出- 因此通过查询对象触发了一些计算;该属性也从变为。gc2time=-62135568000000GregorianCalendarareFieldsSetfalsetrue

两个 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

并运行您的代码,您应该会发现,to转换from工作正常。

如果您想要您toGregorianCalendar()的示例中的自定义提供输入,请使用toGregorianCalendar(TimeZone,Locale,Defaults)并提供更新的默认值以用于转换。

于 2012-10-12T21:33:05.817 回答