繁体   English   中英

Java DST 更改问题

[英]Java DST Change issue

我发现了一个关于 Java DST 更改的问题。 当 DST(夏令时)发生的确切时刻时,该特定时间可能会出现两次。

例如,对于时区 America/Sao_Paulo,它从 2016 年 2 月 21 日星期日 00:00:00 向后更改一小时至 2016 年 2 月 20 日星期六 23:00。 时间 23:00 当天出现两次。

在我的用例中,我想第二次。 例如,当我想要这一天的数据时,我实际上是指完整的这一天(即使它可能包含 25 小时)。

但在我看来,Java似乎占据了这一刻的第一次。

例子:

@Test
public void testDSTChange() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

    TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo");

    long dateInput = sdf.parse("2016-02-20T23:00:00").getTime();
    long dateUTC = dateInput - tz.getOffset(dateInput);

    long dateInput2 = sdf.parse("2016-02-21T02:00:00").getTime();
    long dateUTC2 = dateInput2 - tz.getOffset(dateInput2);

    System.out.println("Difference: " + (dateUTC2 - dateUTC) / 3600 / 1000);

}

在这个例子中,它显示这两个日期之间的差异是 4 小时,而不是我预期的 3 小时。 所以我想知道是否还有其他方法可以做到这一点?

那么,当夏令时向后变化时,夏令时变化的时间会发生两次,没有办法绕过它。 可能还有另一种方法,但让我提出一个建议,在内部使用 UTC 时间 (GMT),它内部没有 DST,在输出时转换为本地时间(挂钟时间)仅用于显示目的。 你再也不用担心了。

在我的用例中,我想第二次。 例如,当我想要这一天的数据时,我实际上是指完整的这一天(即使它可能包含 25 小时)。

从这个陈述中,我假设您实际上正在执行某种范围查询以收集一整天的数据。 接近这一点的最好办法是从一天包容的开始查询,第二天专属的开始。 换句话说: startOfDay <= dataPoint(s) < startOfNextDay

这在您的场景中效果很好,因为直到第二天开始,时钟才真正到达00:00 它的滴答声是这样的:

23:58
23:59
23:00
23:01
...
23:58
23:59
00:00  <--- start of next day

所以使用半开间隔,它应该可以解决。

但是在春季过渡时要小心,当一天的开始是01:00 ,而不是00:00 :)

此外,Jon 关于使用 Java 8 的新时间 API 或 Joda-Time 的评论是正确的。 它们都可以让您更好地控制这种情况。 较旧的 Java API 没有。

LocalDateTime l1 = LocalDateTime.of(2016, Month.FEBRUARY, 20, 23, 0, 0);
ZoneId id = ZoneId.of("America/Sao_Paulo");  
ZoneOffset offset = ZoneOffset.of("-08:00");
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(l1, offset, id);
long el1= zonedDateTime.toEpochSecond();



LocalDateTime l2 = LocalDateTime.of(2016, Month.FEBRUARY, 21, 2, 0, 0);
ZonedDateTime zonedDateTime1 = ZonedDateTime.ofInstant(l2, offset, id);;
long el2= zonedDateTime1.toEpochSecond();


System.out.println("Difference: " + (el2-el1 ) / 3600 );

    ====================================
    on console it prints 
    Difference: 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM