java Long到XMLGregorianCalendar和back到Long
我试图将毫秒时间戳转换为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?
# 1 楼答案
我相信这就是问题所在。根据文档,
toGregorianCalendar()
在缺少任何字段时,依赖于GregorianCalendar
相应的默认值进行转换如果您尝试:
然后运行您的代码,您应该会发现
to
和from
转换都可以正常工作如果您希望您的
toGregorianCalendar()
与示例中一样提供自定义输入,请使用toGregorianCalendar(TimeZone,Locale,Defaults)
并提供更新后的默认值以用于转换# 2 楼答案
有趣的是,对于小于(约)-100000000000L(和正值)的值,它可以正常工作,但较大的负值会变得不一致
如果打印出
gc
、xc
和gc2
,您可以看到问题出现的地方(从XMLGregorianCalendar到GregorianCalendar的转换)如果打印出
xc
的字段,则得到1,1,1对于
gc2
,得到1,0,1(与xc
匹配,因为月份在GregorianCalendar中是零)但是,添加这些3
println
调用会更改打印输出gc2
来自gc2
的time=?
输出更改为time=-62135568000000
,因此通过查询GregorianCalendar
对象触发了一些计算;areFieldsSet
属性也从false
更改为true
两个GregoriaCalendar的时区不同,但这并不能解释错误,即使设置了明确的时区和区域设置,错误也会持续存在