2017-08-07 80 views
2

下面是我们尝试编码的逻辑。ZonedDateTime中的plusSeconds未按预期工作

我们有UTC的startdate(SD)和enddate(ED),我们首先将startdate转换为PST(SD_PST),然后在startdate和enddate之间加上PST转换后的startdate(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](据我所知,在DST -7小时被添加)。

请帮我理解输出。

+0

所以我们在运行在PST时区(美国科罗拉多州丹佛市)的jvm上运行代码,使用休眠从数据库中提取startdate和enddate。基本上增加一个小时到2017-03-12T1:00-08:00 [PST8PDT]使其到2017-03-12T3:00-07:00 [PST8PDT] – Astlez

+0

我不明白你想要做什么。你为什么不给UTC时间添加秒(“即时”)? –

+0

此外,我强烈建议您将系统/ JVM时区设置为“America/Los_Angeles”或“America/Vancouver”,而不是“PST8PDT”。 –

回答

1

您在评论中告诉,增加一小时到2017-03-12T1:00-08:00[PST8PDT]使其成为2017-03-12T3:00-07:00[PST8PDT]。那么,这是正确的。

发生这种情况是因为Dayligh Saving Time(夏令时)或PST8PDT时区starts at the second Sunday of March, at 2 AM。当时间到达凌晨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

,如果你得到每个日期(所以你必须在UTC的同一日期)的相应Instant这可以变得更加清晰:

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小时。