【发布时间】:2019-06-16 23:23:15
【问题描述】:
所以我有一个带有日期/时间字段的 XML Soap 响应,表示如下:
<BusStopTime>
<BusStopId>1023</BusStopId>
<Order>1</Order>
<PassingTime>1899-12-30T07:20:00</PassingTime>
</BusStopTime>
我对日期不感兴趣(因为这是一些我无法控制的遗留表示),而是时间。 WS 工具将该字段转换为XMLGregorianCalendar,我的目标是进行转换。
var date = DatatypeFactory.newInstance()
.newXMLGregorianCalendar("1899-12-30T07:20:00")
.toGregorianCalendar().toInstant()
转换为LocalDateTime 是siLocalimple。我正在明确设置 TimeZone 以避免局部冲突
LocalDateTime.ofInstant(date, ZoneId.of("Europe/Warsaw"))
导致 1899-12-30T07:44
LocalDateTime.ofInstant(date, ZoneId.of("Europe/Berlin"))
给我一个不同的输出1899-12-30T07:20
当日期从现代开始时(1900 年及之后) - 一切正常。所以问题是:十九世纪之交柏林和华沙之间究竟发生了什么?或者说得更清楚一点——为什么时间的变化如此诡异?
我在 JDK8 和 JDK11 上运行(观察相同的行为)
{ ~ } » java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
【问题讨论】:
-
您有什么顾虑?
-
当我运行您的代码时,我得到的 1900 年之后日期的差异完全相同。例如,
1914-12-30T07:20:00在华沙也变成了 7:44,在柏林也变成了 7:20。 -
当我尝试在不同时区从您的示例字符串
1899-12-30T07:20:00创建XMLGregorianCalendar时,我确实得到了一些令人惊讶的结果。如果您可以从 XML 中获取字符串,请使用LocalDateTime.parse("1899-12-30T07:20:00")以获得可预测的结果。 -
谢谢奥莱!我在考虑时区,但找不到任何参考。你的消息来源很棒。我在转换
(LocalDateTime.parse(xmllGregoriaCalendar.toXmlFormat())时没有遇到问题 - 就像一个魅力。但对算法和规则本身很好奇。如果您将其添加为答案,我会很乐意接受它
标签: java datetime time timezone xmlgregoriancalendar