Java 分区DateTime中的秒数未按预期工作
下面是我们试图编写的逻辑 我们有UTC格式的开始日期(SD)和结束日期(ED),我们首先将开始日期转换为PST(SD\PST),然后将开始日期和结束日期之间的差异添加到PST转换的开始日期(SD\PST+(ED减去SD))中,以获得ED\PST(PST格式的结束日期) 下面是我们的部分代码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
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:00Z2017-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