如何在没有Joda time的Java 7中正确处理夏令时



在标记它之前,请彻底阅读它。另外,不能使用Joda Time和Java 8 Time.util*.

我正在尝试获取启用夏令时的国家/地区的当前日期。由于时区是[local-millis] = [UTC-millis] + [offset-millis],所以我添加了DST_OFFSET来获取启用DST的国家的时间,就像在Linux机器GMT_TIME + LOCAL_TIME_ZONE_OFFSET + DST_OFFSET上获取当前本地时间一样。

打印伊斯坦布尔当前时间的代码,该时间当前已启用夏令时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());
    }
}

这给了我正确的输出

Current date and time : 2015-11-01 20:49:54
The Hour of the Day is : 20
The TimeZone is : Europe/Istanbul

但由于上面的代码不太通用,所以我尝试添加以下行,这样,如果只启用了日光,那么只添加dstSaving所以我用更改了下面的calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());

if (timeZone.inDaylightTime(new Date())){
            calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
       }

但问题是,如果我这样做,我得到的输出没有任何夏令时。打印System.out.println(timeZone.inDaylightTime(new Date()));给了我错误的结果,但正如你在伊斯坦布尔时钟的链接中看到的那样,夏令时是存在的

Current date and time : 2015-11-01 19:54:49
The TimeZone is : Europe/Istanbul.

巴西时区的逻辑与我在DaylightTime中的逻辑相同,但现在提前一小时显示结果

Ideone链接以1中讨论的方式排序的所有代码。https://ideone.com/4NR5Ym2.https://ideone.com/xH7vhp3.https://ideone.com/tQenb5

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

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

这可能是因为土耳其将夏令时从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

该工具似乎没有输出任何更新,所以为了验证运行:

java -jar tzupdater.jar --version 

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

您不应该这样做:

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

你也不应该这样做:

if (timeZone.inDaylightTime(new Date())){
    calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
}

您不需要手动调整时间。它是根据您设置格式的日期自动为您完成的。调用add只会移动正在使用的即时时间点。

删除这些行,并更新JVM以接受最新的土耳其夏令时更改(正如Monz在回答中所描述的),您应该可以开始了。

相关内容

  • 没有找到相关文章

最新更新