ZonedDateTime中的plusSeconds未按预期工作

时间:2017-08-07 11:45:49

标签: java utc dst pst zoneddatetime

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

我们在UTC中有开始日期(SD)和结束日期(ED),我们首先将startdate转换为PST(SD_PST),然后将startdate和enddate之间的差异添加到PST转换的startdate(SD_PST +(ED减去SD))以获得ED_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](我知道在dst -7小时内会添加)。< / p>

请帮我理解输出。

1 个答案:

答案 0 :(得分:1)

您在评论中告诉我们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中的Dayligh Saving Time(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点,DST开始,时钟向前移动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小时。