将XMLGregorianCalendar转换为java.time.Instant+;同时切换时区
我正在尝试将XMLGregorianCalendar中给定的变量转换为java.time.Instant。此外,原始变量是在中央标准时间(美国/芝加哥),我需要UTC。我就是这么做的,但它以UTC-7返回一个瞬间:将XMLGregorianCalendar转换为java.time.Instant+;同时切换时区,java,timezone,Java,Timezone,我正在尝试将XMLGregorianCalendar中给定的变量转换为java.time.Instant。此外,原始变量是在中央标准时间(美国/芝加哥),我需要UTC。我就是这么做的,但它以UTC-7返回一个瞬间: XMLGregorianCalendar xgc = header.getCaptureDate(); Instant convertedDateTime = xgc.toGregorianCalendar().toInstant().atOffset(ZoneOffset.UTC)
XMLGregorianCalendar xgc = header.getCaptureDate();
Instant convertedDateTime = xgc.toGregorianCalendar().toInstant().atOffset(ZoneOffset.UTC).toInstant();
我真的很困惑我做错了什么
xgc的
xgc
看起来是这样的:2018-04-13T06:30:23
,我需要这个:2018-04-13T11:30:23Z
(Z添加到末尾,加上时区更改)。然而,现在我明白了:2018-04-13T04:30:23Z
感谢您在寻找解决方案方面的合作。我同意你最后的评论:
Instant convertedDateTime = xgc.toGregorianCalendar()
.toZonedDateTime()
.withZoneSameLocal(ZoneId.of("America/Chicago"))
.toInstant();
System.out.println(convertedDateTime);
它打印所需的图像
2018-04-13T11:30:23Z
即时
没有时区。它的toString
方法(打印时隐式调用)以UTC格式生成字符串。字符串末尾的Z
表示UTC或偏移量为零
由于我们提供了一个实时时区(美国/芝加哥),代码将为我们调整夏季时间(夏令时)。这里唯一的问题是秋天时钟什么时候倒转。例如,2018年11月4日,时钟将从2倒转为1,因此如果我们得到的时间介于1和2之间,我们无法知道它是否在DST中。如果您的xmlgoriancalendar
中有UTC偏移量,它会给我们一个明确的时间点。但我们必须自己提供,这正是与Zonesamelocal
通话所做的
你的代码出了什么问题?
我假设JVM的时区设置是某个中欧时区(如欧洲/奥斯陆或欧洲/罗马),该时区在4月13日的DST上,即UTC偏移量+02:00(也称为CEST)。
XMLGregorianCalendar
中没有偏移量,转换为即时
假设时间在该时区,因此转换为2018-04-13T04:30:23Z
。转换为OffsetDateTime
并返回到Instant
没有任何区别。您注意到它太早了7个小时,并假设它位于时区偏移UTC-7(它不是;Z
仍然表示UTC)。完成,感谢您的推荐,注意到!因此,它返回CET,我需要UTC,这很容易更正,但我更担心的是,使用小时数可能会因夏令时而导致问题,还是我错了?是的,xgc
在CST(美国/芝加哥)中。我的意思是,您推荐的时间为(-7)的解决方案在中欧时间返回了一个值。如果我将它设置为小时(-5),它可以工作,但是我们遇到了DST问题,这太奇怪了,现在我意识到xgc.toGregorianCalendar().tozoneDateTime().getOffset()
返回+2:00
,我想这是在你的帮助下的主要问题,我找到了它,它是如何工作的,所以非常感谢,我仍然需要考虑一下,为什么。如果我将代码更改为:.toGregorianCalendar().toZoneDateTime()。带有ZoneMaleLocal(ZoneId.of(“America/Chicago”))。toInstant()
,它可以工作,我认为它应该随时正确