ZonedDateTime 中的 plusSeconds 未按预期工作

plusSeconds in ZonedDateTime not working as expected

下面是我们尝试编码的逻辑。

我们有UTC格式的开始日期(SD)和结束日期(ED),我们首先将开始日期转换为PST(SD_PST),然后将开始日期和结束日期之间的差异添加到PST转换后的开始日期(SD_PST+(ED 减去 SD)) 以获得 ED_PST(PST 结束日期)

下面是我们的部分代码。

Duration duration = Duration.between(sud.getStartTime().toInstant(),
sud.getEndTime().toInstant()); // Sun Mar 12 08:00:00 PDT 2017 - [sud.getStartTime()] & Sun Mar 12 09:00:00 PDT 2017 - [sud.getEndTime()] 

ZonedDateTime ldt = ZonedDateTime.ofInstant(convertToPst(sud.getStartTime()).toInstant(),
        ZoneId.systemDefault()); // ldt now is 2017-03-12T1:00-08:00[PST8PDT]

ldt = ldt.plusSeconds(duration.getSeconds()); // ldt now is 2017-03-12T3:00-07:00[PST8PDT] , duration.getSeconds() is 3600
Date f2 = Date.from(ldt.toInstant()); // output Sun Mar 12 03:00:00 PDT 2017 

我知道夏令时会影响输出,但我无法理解如何额外增加 1 小时,我的预期输出是 2017-03-12T2:00-07:00[PST8PDT](我知道在夏令时增加了 -7 小时) .

请帮助我理解输出。

您在评论中提到 2017-03-12T1:00-08:00[PST8PDT] 上加一小时就可以达到 2017-03-12T3:00-07:00[PST8PDT]。嗯,这是正确的。

发生这种情况是因为 PST8PDT 时区 starts at the second Sunday of March, at 2 AM 的夏令时(DST 或夏令时)。当时间到达凌晨 2 点时,时钟向前移动 1 小时到凌晨 3 点,偏移量从 -08:00 变为 -07:00

取此代码:

ZonedDateTime zdt = ZonedDateTime.parse("2017-03-12T01:00-08:00[PST8PDT]");
System.out.println(zdt); // 2017-03-12T01:00-08:00[PST8PDT]
System.out.println(zdt.plusHours(1)); // 2017-03-12T03:00-07:00[PST8PDT]

输出为:

2017-03-12T01:00-08:00[PST8PDT]
2017-03-12T03:00-07:00[PST8PDT]

请注意,在凌晨 1 点,偏移量为 -08:00。然后我加了1小时,当地时间应该改成凌晨2点了。但是在凌晨 2 点,夏令时开始,时钟向前 移动 1 小时到凌晨 3 点,偏移量变为 -07:00.

如果您获得每个日期的相应 Instant,这会变得更清楚(因此您将拥有相同的 UTC 日期):

ZonedDateTime zdt = ZonedDateTime.parse("2017-03-12T01:00-08:00[PST8PDT]");
System.out.println(zdt.toInstant()); // 2017-03-12T09:00:00Z
System.out.println(zdt.plusHours(1).toInstant()); // 2017-03-12T10:00:00Z

输出为:

2017-03-12T09:00:00Z
2017-03-12T10:00:00Z

请注意,实际时差为 1 小时。