如何在没有Joda Time的情况下在Java 7中正确处理夏令时?

Ank*_*and 5 java timezone datetime calendar dst

在标记之前重复读取它彻底Plus不能使用Joda Time和Java 8 time.util*.

我正在尝试获取启用了DST的国家/地区的当前日期.因为它有时区,[local-millis] = [UTC-millis] + [offset-millis]所以我添加了DST_OFFSET它以获得启用DST的国家的时间,就像在Linux机器GMT_TIME + LOCAL_TIME_ZONE_OFFSET + DST_OFFSET上完成以获得当前的本地时间.

打印当前DST启用时间为1小时的当前伊斯坦布尔时间的代码.

public class DstInstanbul {

    public static void main(String...args){

        Calendar calendar = Calendar.getInstance();

        TimeZone timeZone = TimeZone.getTimeZone("Europe/Istanbul");

        calendar.setTimeZone(timeZone);

        calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());


        SimpleDateFormat simpleDateFormatLocal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        simpleDateFormatLocal.setTimeZone(TimeZone.getTimeZone("Europe/Istanbul"));

        System.out.println("Current date and time : " + simpleDateFormatLocal.format(calendar.getTime()));


       System.out.println("Current date and time : " + simpleDateFormatLocal.format(calendar.getTime()));
       System.out.println("The TimeZone is : " + calendar.getTimeZone().getID());

    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我正确的输出

Current date and time : 2015-11-01 20:49:54
The Hour of the Day is : 20
The TimeZone is : Europe/Istanbul
Run Code Online (Sandbox Code Playgroud)

但由于上面的代码是没有这么多的通用的,所以我试图添加以下行,因此,如果仅白天启用然后只添加dstSaving所以我改变了以下calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());

if (timeZone.inDaylightTime(new Date())){
            calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
       }
Run Code Online (Sandbox Code Playgroud)

但问题是,如果我这样做,我得到没有任何夏令时的输出.和印刷System.out.println(timeZone.inDaylightTime(new Date()));给我假,因此结果,但在这个链接伊斯坦布尔时钟,你可以看到夏令时

Current date and time : 2015-11-01 19:54:49
The TimeZone is : Europe/Istanbul.
Run Code Online (Sandbox Code Playgroud)

对于时区巴西来说,相同的逻辑对于inDaylightTime来说是正确的,但现在提前一小时显示结果

以讨论的方式订购的所有代码的Ideone链接1. https://ideone.com/4NR5Ym 2. https://ideone.com/xH7vhp 3. https://ideone.com/tQenb5

我的问题是timeZone.inDaylightTime(new Date())与伊斯坦布尔时区有什么问题.为什么它显示错误.为什么对巴西来说,即使这inDaylightTime是真的,我也没有获得当前的DST时间.处理这种情况的正确方法是什么?

Mon*_*onz 4

今天土耳其似乎存在一些有关时区和夏令时的问题。

这可能是因为土耳其将夏令时切换日期从 11 月 1 日更改为 11 月 8 日。

JVM 中的时区数据可能不会随着更改而更新。 Oracle 对其 JVM 进行了更新。

您从上面的链接下载的时区数据更新程序是一个可执行的 jar 文件。要更新 UNIX 主机上的 JVM:

sudo java -jar tzupdater.jar --update --location http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz
Run Code Online (Sandbox Code Playgroud)

该工具似乎没有在更新时输出任何内容,因此要验证运行:

java -jar tzupdater.jar --version 
Run Code Online (Sandbox Code Playgroud)

土耳其更新的时区数据版本是tzdata2015g