2

下面是我们试图编码的逻辑。

我们有 UTC 中的 startdate(SD) 和 enddate(ED),我们首先将 startdate 转换为 PST(SD_PST),然后将 startdate 和 enddate 之间的差异添加到 PST 转换的 startdate (SD_PST+(ED 减去 SD)) 以获得 ED_PST(end date在太平洋标准时间)

下面是我们的部分代码。

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

请帮助我理解输出。

4

1 回答 1

1

你在评论中说,增加一小时2017-03-12T1:00-08:00[PST8PDT]2017-03-12T3:00-07:00[PST8PDT]. 嗯,这是正确的。

发生这种情况是因为时区的夏令时(DST 或夏令时)PST8PDT3 月的第二个星期日凌晨 2 点开始。当时间到达凌晨 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 小时。

于 2017-08-07T13:46:32.803 回答