Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XMLGregorianCalendar转换为java.time.Instant+;同时切换时区_Java_Timezone - Fatal编程技术网

将XMLGregorianCalendar转换为java.time.Instant+;同时切换时区

将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中给定的变量转换为java.time.Instant。此外,原始变量是在中央标准时间(美国/芝加哥),我需要UTC。我就是这么做的,但它以UTC-7返回一个瞬间:

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()
,它可以工作,我认为它应该随时正确