下面是我们正在试图编码的逻辑。
我们在UTC有开始日期(SD)和结束日期(ED),我们首先将开始日期(SD_PST)转换为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] (我理解在DST-7小时被添加)。
请帮我理解输出。
发布于 2017-08-07 13:46:32
你在评论中说给 2017-03-12T3:00-07:00[PST8PDT].增加了一个小时,就可以了。嗯,这是正确的。
这是因为PST8PDT时区3月的第二个星期日凌晨2点开始。中的Dayligh节约时间(DST或夏季时间)。当时间达到2AM时,时钟向前移动1小时至3AM,偏移量从-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:00PST8PDT 2017-03-12 T03:00-07:00 PST8PDT
注意,在1AM时,偏移量为-08:00。然后我加了1小时,当地时间应该改为凌晨2点。但在凌晨2点,DST启动,时钟被移动1小时前进到3 AM,偏移量改变到-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-12 T09:00:00 Z 2017-03-12 T10:00:00 Z
请注意,差别实际上是1小时。
https://stackoverflow.com/questions/45546165
复制相似问题