首页 > 解决方案 > Java 时区数据库与 IANA 数据

问题描述

在非洲/卡萨布兰卡时区的 IANA 数据库和 Java tzdb.dat 2019c 数据库之间存在夏令时差异,这让我非常困惑。可能还有其他人,但我找到了这个。据我所知,IANA 时区数据库清楚地表明摩洛哥(非洲/卡萨布兰卡)支持 DST,不幸的是,2019c 版本中的 Java 时区数据库 tzdb.dat 不同意。这已经并将给我带来无限的悲伤。我在这里错过了什么,或者其他人看到过这种事情

非洲/卡萨布兰卡的 IANA 表 2019c

注意:下表部分显示正常时间为 UTC+1,夏令时为 UTC 斜线 (/) 分隔标准和夏令时缩写

区域名称 STDOFF 规则格式 [直到]

非洲区/卡萨布兰卡 -0:30:20 - LMT 1913 年 10 月 26 日

         0:00   Morocco +00/+01 1984 Mar 16
         1:00   -   +01 1986
         0:00   Morocco +00/+01 2018 Oct 28  3:00    
         1:00   Morocco +01/+00

从 2018 年 10 月 28 日到现在的偏移量是标准时间 +1 和夏令时 +0(斜线 (/) 分隔标准和夏令时缩写。) STDOFF 1:00 所以添加到 UT 以获得标准时间的时间量,没有夏令时的任何调整都对应于当前摩洛哥时间的 UTC +1。因此,我们采用 UTC 区域非洲/卡萨布兰卡,并根据斋月添加偏移量 +01/+00。

考试

我写了一个简单的 Java 类来检查 2019c TZDB。此类(如下所示)表明最新的 Java 时区数据文件 tzdb.dat 文件有问题。此测试使用 IBM SR5FP40 和时区 2019c 数据文件运行。我在使用 2019c 数据文件的 OpenJDK 中得到了相同的结果。

tzdb.dat 的第一行显示 2019c TZDB 2019cX Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers

显示问题的测试

Time Zone = Africa/Cas​​ablanca Supports Day light Savings time = false Date Mon May 20 00:00:00 WET 2019 目前在 DST false 时区名称 西欧时区 ID Africa/Cas​​ablanca

还运行了基线测试以显示是否支持 DST,代码将显示它。

Time Zone = Europe/Rome Supports Day light Savings time = true Date Mon May 20 00:00:00 CEST 2019 is current in DST true Time zone name Central European Time zone ID Europe/Rome

代码在这里供参考

import java.util.*; 
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class checkdaylight{ 

    public static void main(String[] args) 
    { 

        // Create TimeZone object
        //Europe/Rome
        //Pacific/Pago_Pago
        //Africa/Casablanca
        String TimezoneToTest = "Africa/Casablanca";
        System.out.println("Time Zone = " + TimezoneToTest);
        TimeZone obj = TimeZone.getTimeZone(TimezoneToTest); 
        TimeZone.setDefault(TimeZone.getTimeZone(TimezoneToTest)); //to avoid confusion

        // Checking day light time 
        // and displaying the result 
        System.out.println("Supports Day light Savings time  = "
                        + obj.useDaylightTime()); 
        String pattern = "yyyy-MM-dd";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        try{
            simpleDateFormat.setTimeZone(TimeZone.getTimeZone(TimezoneToTest));
            Date checkdate = simpleDateFormat.parse("2019-05-20");
            System.out.println("Date " + checkdate.toString()+ " is currently in DST "+ obj.inDaylightTime(checkdate));
         } catch (ParseException e) {
            e.printStackTrace();
        }

        System.out.println("Time zone name " +obj.getDisplayName());
        System.out.println("Time zone ID " + obj.getID());

    } 
} 

标签: javatimezonedst

解决方案



推荐阅读