为 Java 个时区生成自定义 tzdb.dat
Generate a custom tzdb.dat for Java time zones
使用 Java 1.6 我从 .zic 文件生成了一个 jre/lib/zi/America/Sao_Paulo 时区文件,其内容如下:
Rule Brazil 2012 only - Feb 26 06:00 0 S
Rule Brazil 2012 only - Oct 21 00:00 1 D
Rule Brazil 2013 only - Feb 17 06:00 0 S
Rule Brazil 2013 only - Oct 20 00:00 1 D
Rule Brazil 2014 only - Feb 16 06:00 0 S
Rule Brazil 2014 only - Oct 19 00:00 1 D
Rule Brazil 2015 only - Feb 22 06:00 0 S
Rule Brazil 2015 only - Oct 18 00:00 1 D
Rule Brazil 2016 only - Feb 21 06:00 0 S
Rule Brazil 2016 only - Oct 16 00:00 1 D
Rule Brazil 2017 only - Feb 19 06:00 0 S
Rule Brazil 2017 only - Oct 15 00:00 1 D
Zone Brazil/East -3:00 Brazil BR%sT
现在,在 Java 8 中,jre/lib/zi 文件夹不再存在。它被 jre/lib/tzdb.dat 文件取代。
如何使用我的自定义时区生成此 tzdb.dat 文件?
您或许可以试试这个反向移植-class:
但请注意:它 不是 public(您可以通过复制粘贴或类似方式绕过它)因此并非真正用于 public用法。此外,它不是 oracle 使用的原始 tz 编译器,但可能会创建相同的输出(假设此细节在 java.time 的 backport 中保持相同)。
我同意 Matt Johnson 的意见,即尽可能避免使用自定义时区,而是调整应用程序代码。您还可以考虑通过定义专门的 zone rules(通过官方 Java-8-API)来创建自定义时区。
我找到了解决方案。
- 从 Internet 号码分配机构 (iana - http://www.iana.org/time-zones). In my case, Time Zone Data v. 2015f (http://www.iana.org/time-zones/repository/releases/tzdata2015f.tar.gz) 下载时区数据库
- 解压缩压缩文件。
- 编辑引用该位置的文件。就我而言,南美洲。
用自定义值替换这些行。
仅统治巴西 2012 - 2 月 26 日 06:00 0 S
仅规则巴西 2012 - 10 月 21 日 00:00 1 D
将文件重新打包成 tar.gz 文件。
- 计算文件的 sha512 哈希 (https://defuse.ca/checksums.htm#checksums)
- 创建一个包含 sha512 哈希的文件。
- 使用与 tar.gz 相同的名称命名此文件,并在名称末尾添加 .sha512。
- 将两个文件放在同一个目录下
使用时区更新工具 (tzupdater.jar) - http://www.oracle.com/us/technologies/java/tzupdater-readme-136440.html - 创建新的 tzdb.dat 文件
java -jar tzupdater.jar -f -l file:///path/to/file/tzdata2015f.tar.gz
瞧!
使用 Java 1.6 我从 .zic 文件生成了一个 jre/lib/zi/America/Sao_Paulo 时区文件,其内容如下:
Rule Brazil 2012 only - Feb 26 06:00 0 S
Rule Brazil 2012 only - Oct 21 00:00 1 D
Rule Brazil 2013 only - Feb 17 06:00 0 S
Rule Brazil 2013 only - Oct 20 00:00 1 D
Rule Brazil 2014 only - Feb 16 06:00 0 S
Rule Brazil 2014 only - Oct 19 00:00 1 D
Rule Brazil 2015 only - Feb 22 06:00 0 S
Rule Brazil 2015 only - Oct 18 00:00 1 D
Rule Brazil 2016 only - Feb 21 06:00 0 S
Rule Brazil 2016 only - Oct 16 00:00 1 D
Rule Brazil 2017 only - Feb 19 06:00 0 S
Rule Brazil 2017 only - Oct 15 00:00 1 D
Zone Brazil/East -3:00 Brazil BR%sT
现在,在 Java 8 中,jre/lib/zi 文件夹不再存在。它被 jre/lib/tzdb.dat 文件取代。
如何使用我的自定义时区生成此 tzdb.dat 文件?
您或许可以试试这个反向移植-class:
但请注意:它 不是 public(您可以通过复制粘贴或类似方式绕过它)因此并非真正用于 public用法。此外,它不是 oracle 使用的原始 tz 编译器,但可能会创建相同的输出(假设此细节在 java.time 的 backport 中保持相同)。
我同意 Matt Johnson 的意见,即尽可能避免使用自定义时区,而是调整应用程序代码。您还可以考虑通过定义专门的 zone rules(通过官方 Java-8-API)来创建自定义时区。
我找到了解决方案。
- 从 Internet 号码分配机构 (iana - http://www.iana.org/time-zones). In my case, Time Zone Data v. 2015f (http://www.iana.org/time-zones/repository/releases/tzdata2015f.tar.gz) 下载时区数据库
- 解压缩压缩文件。
- 编辑引用该位置的文件。就我而言,南美洲。
用自定义值替换这些行。
仅统治巴西 2012 - 2 月 26 日 06:00 0 S 仅规则巴西 2012 - 10 月 21 日 00:00 1 D
将文件重新打包成 tar.gz 文件。
- 计算文件的 sha512 哈希 (https://defuse.ca/checksums.htm#checksums)
- 创建一个包含 sha512 哈希的文件。
- 使用与 tar.gz 相同的名称命名此文件,并在名称末尾添加 .sha512。
- 将两个文件放在同一个目录下
使用时区更新工具 (tzupdater.jar) - http://www.oracle.com/us/technologies/java/tzupdater-readme-136440.html - 创建新的 tzdb.dat 文件
java -jar tzupdater.jar -f -l file:///path/to/file/tzdata2015f.tar.gz
瞧!