如何显示Java中的夏令时开始后的时间差异?

时间:2018-11-07 07:27:37

标签: java timezone dst

我想检查夏令时开始前后的时间差。我正在使用JVM,其中时区与DST WRT巴西时间有关。我看到的输出显示10月21日属于DST,这是错误的,因为夏令时从11月4日开始。我希望看到10月20日至10月21日之间的时差为1小时,由于JRE时区问题,我可以在我的应用程序中看到该时差。有什么办法可以通过程序来实现。在下面的代码中,我用来查看日期是否在DST之下。

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class Timezone
{
    public static void main(String[] args) throws ParseException {
        TimeZone TIMEZONE = TimeZone.getTimeZone("Brazil/East");

        System.out.println("timeZone : " + TIMEZONE);
        Calendar c = Calendar.getInstance(TIMEZONE);
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        dateFormat.setTimeZone(TIMEZONE);

        Date date = dateFormat.parse("2018-10-20T00:00:00");
        c.setTime(date);
        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

        date = dateFormat.parse("2018-10-21T00:00:00");
        c.setTime(date);

        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

        date = dateFormat.parse("2018-11-04T00:00:00");
        c.setTime(date);
        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

    }
}

除了我的问题之外,我还可以使用上述程序确定夏令时的应用。我想告诉我什么:10月20日,时间是上午9点,而由于夏令时,时间是1小时,即上午10点。有什么办法可以做到这一点?

预期输出:

     timeZone : sun.util.calendar.ZoneInfo[id="Brazil/East"]

         Time is: 21-10-2018 07:52:16

实际输出错误的JVM:

        timeZone : timeZone : sun.util.calendar.ZoneInfo[id="Brazil/East"]

       Time is: 21-10-2018 08:52:30

2 个答案:

答案 0 :(得分:3)

解决方案是使用错误的(过时的)时区数据修复JVM。使用Oracle的时区更新工具非常简单。请参阅底部的链接(有关OpenJDK的信息,请参见下一个链接)。

如果您想知道JVM何时“思考”夏令时(DST)的开始,可以使用以下代码:

    ZoneId zone = ZoneId.of("America/Sao_Paulo");
    ZoneRules rules = zone.getRules();
    ZoneOffsetTransition dstStarted = rules.previousTransition(Instant.now());
    System.out.println(dstStarted);

很明显,我的Java 11具有从11月4日夏季开始的新鲜时区数据。我得到了以下输出:

  

Transition [差距在2018-11-04T00:00-03:00到-02:00]

“间隙”是指夏令时开始时时钟向前。将时钟向后翻转的过渡打印为“重叠”。

如果需要,您还可以查询ZoneOffsetTransition,以了解过渡之前和之后的本地日期和时间,过渡的瞬间,过渡之前和之后应用的UTC偏移量,过渡(此处为1小时)和其他信息。

我建议使用java.time(现代Java日期和时间API)。您使用的日期时间类-TimeZoneCalendarDateFormatSimpleDateFormatDate —设计得很差,而且已经过时了。

链接

答案 1 :(得分:2)

我将添加一个非常简短的答案。它表明1天不等于24小时,即DST已更改。我也开始使用Java 8,因为我对Java 8更加熟悉。

ZoneId timezone = ZoneId.of("Brazil/East");

ZonedDateTime t = ZonedDateTime.of(2018, 10, 20, 7, 52, 16, 0, timezone);

System.out.println(t);
System.out.println(t.plus(1, ChronoUnit.DAYS));
System.out.println(t.plus(24, ChronoUnit.HOURS));

输出:

2018-10-20T07:52:16-03:00 [巴西/东部]
2018-10-21T 07 :52:16-02:00 [巴西/东部]
2018-10-21T 08 :52:16-02:00 [巴西/东部]