Java 分区DateTime中的秒数未按预期工作

Java 分区DateTime中的秒数未按预期工作,java,utc,dst,pst,zoneddatetime,Java,Utc,Dst,Pst,Zoneddatetime,下面是我们试图编写的逻辑 我们有UTC格式的开始日期(SD)和结束日期(ED),我们首先将开始日期转换为PST(SD\PST),然后将开始日期和结束日期之间的差异添加到PST转换的开始日期(SD\PST+(ED减去SD))中,以获得ED\PST(PST格式的结束日期) 下面是我们的部分代码 Duration duration = Duration.between(sud.getStartTime().toInstant(), sud.getEndTime().toInstant()); // S

下面是我们试图编写的逻辑

我们有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]
(我知道在dst中-添加7小时)


请帮助我理解输出。

您在评论中告诉我,
2017-03-12T1:00-08:00[PST8PDT]
中添加一个小时将使其成为
2017-03-12T3:00-07:00[PST8PDT]
。嗯,这是正确的

这是因为白天在
PST8PDT
时区节省时间(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

如果您获得每个日期对应的
即时
(因此您将在UTC中拥有这些相同的日期),这一点会变得更加清楚:

输出为:

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


请注意,差异实际上是1小时。

因此,我们在PST时区(美国科罗拉多州丹佛市)运行的jvm中运行代码,startdate和enddate使用hibernate从数据库中获取。基本上,在2017-03-12T1:00-08:00[PST8PDT]的基础上增加一个小时,就等于2017-03-12T3:00-07:00[PST8PDT]我不明白你想做什么。为什么不在UTC时间(即
即时时间
)上增加秒数呢?另外,我强烈建议您将系统/JVM时区设置为
美国/洛杉矶
美国/温哥华
,而不是
PST8PDT
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