我正在尝试将毫秒时间戳转换为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?
答案 0 :(得分:3)
有趣 - 它适用于低于(约)-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=?
的{{1}}输出更改为gc2
- 因此通过查询time=-62135568000000
对象触发了一些计算; GregorianCalendar
属性也会从areFieldsSet
更改为false
。
两个GregorianCalendars的时区不同,但这并不能解释错误,即使您设置了显式的TimeZone和Locale,错误也会持续存在。
答案 1 :(得分:-1)
我相信这是问题所在。根据文档,toGregorianCalendar()
在缺少任何字段时依赖于GregorianCalendar
相应的转换默认值。
如果您尝试:
Date date = new Date();
long ts = date.getTime(); //in place of your input
并运行您的代码,您应该会发现,to
和from
转换工作正常。
如果您希望toGregorianCalendar()
使用自定义提供输入,请使用toGregorianCalendar(TimeZone,Locale,Defaults)
并提供要在转换中使用的更新默认值。