java - 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/Casablanca Supports Day light Savings time = false Date Mon May 20 00:00:00 WET 2019 目前在 DST false 时区名称 西欧时区 ID Africa/Casablanca
还运行了基线测试以显示是否支持 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());
}
}
解决方案
推荐阅读
- recursion - 您将如何在 MIPS 汇编中编写此代码?
- html - 如何在 Chrome 和移动设备上删除音频标签的圆角?
- hdfs - 获取 GETHDFS ERROR 管理员收益错误
- javascript - EmailJS:仅有时有效
- r - 在略有不同的命名变量上使用相同代码的更快方法
- node.js - Evernote API 开发人员令牌未进行身份验证
- html - 有什么东西使我的代码无法被接受为 XML 文件吗?
- c++ - 我要输入什么来将“SFML-2.5.1-windows-gcc–7.3.0-mingw-64-bit”添加到我的路径中?
- apache-spark - 使用 Spark SQL 和 Hive 写相同的 ORC 数据,为什么 Spark SQL 文件比 hive 大 50%?
- ruby-on-rails - 如何通过 ruby/heroku 添加库存项目?