java - 如何在Java中显示夏令时开始后的时差?

标签 java timezone dst

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

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 点,而同一时间由于 DST 移动了 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

最佳答案

解决方案是使用错误(过时)的时区数据修复 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[Gap at 2018-11-04T00:00-03:00 to -02:00]

“间隙”表示夏令时开始时时钟向前拨动。时钟向后转动的转换被打印为“重叠”。

如果需要,您还可以查询 ZoneOffsetTransition 有关转换前后的本地日期和时间、转换的时刻、转换前后应用的 UTC 偏移量、签名过渡时长(此处为 1 小时)和其他信息。

我推荐 java.time,现代 Java 日期和时间 API。您使用的日期时间类 - TimeZoneCalendarDateFormatSimpleDateFormatDate - 全部设计不佳且早已过时。

链接

关于java - 如何在Java中显示夏令时开始后的时差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53185095/

相关文章:

java - 在多个map()和reduce()调用之间共享数据

java - 使用 JTable.setRowHeight 更改行高不起作用

python - 使用python-twitter库,如何设置时区?

java - 以毫秒为单位获得实际的 DST 节省

Postgresql 没有正确转换时区

java - 如何使用 spring MVC 将数据从数据库导出到 excel 表?

java - 数组性能以及如何获得自变量的性能

java - TimeZone.observesDaylightTime() 需要 API 级别 24;是否有可能在旧的 API 版本中获得它?

ruby-on-rails - Ruby - 获取下一个夏令时更改

python - 在 Pandas 中,将 tz_localize 用于忽略 DST 的时间序列的最佳方法是什么?