在 java 中,有一个javax.xml.datatype.DatatypeFactory可用于导入和导出 xml 日期,如下所示。
String xmlDateIn = "1900-01-01T12:00:00";
DatatypeFactory df = DatatypeFactory.newInstance();
XMLGregorianCalendar xmlCalendar = df.newXMLGregorianCalendar(xmlDateIn);
String xmlDateOut = xmlCalendar.toXMLFormat();
在这个简单的情况下xmlDateIn等于xmlDateOut,正如预期的那样。但如果我想要它,java.lang.Date事情就会变得有趣。
GregorianCalendar gregorianCalendar = xmlCalendar.toGregorianCalendar();
Date dts = gregorianCalendar.getTime();
System.out.println(dts); // prints Mon Jan 01 12:00:00 CET 1900
乍一看它仍然可以正常工作,但实际上内部某些东西似乎已损坏。使用我的 IDE,我可以看到Date对象内部发生了什么。(如果你想知道,我住在 CET 时区。)看看这个奇怪的时区。
当我尝试将其转换回 XML 时,实际上也打印了 9 分钟时区。所以,这不仅仅是内部的事情。
DatatypeFactory df2 = DatatypeFactory.newInstance();
GregorianCalendar gc2 = new GregorianCalendar();
gc2.setTime(dts);
XMLGregorianCalendar xc2 = df2.newXMLGregorianCalendar(gc2);
System.out.println(xc2.toXMLFormat()); // prints 1900-01-01T12:00:00.000+00:09
为了修复它,如果我手动设置时区,事情会变得非常糟糕。看看这个神奇的时刻:
String xmlDateIn = "1900-01-01T12:00:00";
DatatypeFactory df = DatatypeFactory.newInstance();
XMLGregorianCalendar xmlCalendar = df.newXMLGregorianCalendar(xmlDateIn);
xmlCalendar.setTimezone(0); // <--- ONLY CHANGE
GregorianCalendar gregorianCalendar = xmlCalendar.toGregorianCalendar();
Date dts = gregorianCalendar.getTime();
实际上我对我的特定程序有一个解决方法:现在对我有用的是我在导入 xml 时没有设置时区。在Date
随后进行了错误的时区内部,即9分钟。然后,当我最终想将其导出Date
回 xml 时,我确实将 xml gregorian 日历上的时区设置为 0,这神奇地修复了它并再次导出正确的 xml 格式。
但实际上,我想知道这种疯狂的行为是否有任何好的解释。
慕码人2483693
相关分类