时区更新程序工具


作者:Java SE 平台支持团队,2016 年 8 月
目录


简介

提供 TZUpdater 工具是为了能够用较新的时区数据更新已安装的 Java Development Kit (JDK) 和 Java Runtime Environment (JRE) 软件,以适应不同国家/地区夏令时 (DST) 变更的需要。Oracle 依赖于通过 IANA 的时区数据库公开发布的时区数据。

Oracle 建议您首选新的 Oracle Java SE 平台 JDK 或 JRE 更新版本来交付时区数据更新及安全修复等其他产品改进。要查看哪个 JDK 或 JRE 更新版本包含针对您的区域设置的更新时区数据,请参见 JRE 软件中的时区数据版本。但如果您无法使用 Oracle 新的 JDK 或 JRE 更新版本或者关于新版本的时区数据不是最新的可用数据,TZUpdater 工具让您可以在更新时区数据的同时保持其他系统配置和依赖关系不变。

系统要求

TZUpdater 工具支持所有支持的平台上目前支持的所有 Oracle JDK 和 JRE 版本。java.vendor 属性值必须为 Sun Microsystems Inc.Oracle CorporationBEA Systems,Inc.

如果您已在 JDK/JRE 软件上运行 TZUpdater 工具的早期版本,仅当系统需要 JRE 软件中的时区数据版本中所述的特定错误修复,您才需应用此版本的 TZUpdater 工具。

下载

Oracle 技术网 — Java SE 下载页面中提供了用于更新 Oracle Java Runtime Enviroment 当前版本的 TZUpdater 工具版本。

支持客户可以通过 My Oracle Support 下载用于早期版本的 TZUpdater 工具。参见注释 1412103.2
 

用法

TZUpdater 工具修改了用于执行该工具的 JDK/JRE 软件实例。每次执行都会修改一个 JDK/JRE 软件映像。要针对多个 JDK/JRE 软件实例管理该工具,请参见系统级用法部分。

在已安装的 JDK/JRE 软件映像上运行 TZUpdater 工具之前,必须先停止基于该 JDK/JRE 软件运行的所有实例。

使用以下命令运行 TZUpdater 工具:

java -jar tzupdater.jar options
 

要成功更新时区数据,您应确保您有足够的权限来修改 JDK_HOME/jre/libJRE_HOME/lib 目录。如果您没有足够的权限来修改这些目录,请联系系统管理员。

选项

如果不指定任何选项,将显示用法消息。要更新时区数据,请使用 -l-f 选项。

选项
说明
-h, --help
将用法输出到 stdout 并退出。如果您指定此选项,则将忽略其他选项。
-V, --version
输出工具版本、JRE 中的 tzdata 版本、该工具将更新到的 tzdata 版本,然后退出。
-l, --location url-link-to-archive-file
编译、测试并更新所提供的 tzdata.tar.gz 包中的 JRE 时区数据,例如,-l http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz。支持的 URL 协议:http://、https://、file://。如果不提供 URL 链接,该工具将使用 http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz 上最新的 IANA tzdata 包。
-f, --force
强制执行 tzdata 更新。如果要更新到早期版本的 tzdata,请使用此选项。
-v, --verbose
将详细消息显示到 stdout
 
错误处理

遇到意外错误(如磁盘空间不足)时,该工具会尝试还原原始状态。

 
工具更新
  • 2.1 增强功能
     
    • 删除了 -u 选项

      使用 -l 选项更新数据。要了解有关此选项及其他可用选项的信息,请将 -h 选项传递给该工具,如下例所示:

      java -jar tzupdater.jar -h 
      
    • tzupdater.jar 文件进行了数字签名。请使用以下命令验证签名:
      jarsigner -verify -verbose -certs tzupdater.jar
      
     
  • 2.0.3 错误修复
     
    • JDK-8151879:TZupdater 不能使用 tzdata2016b 版更新
     
  • 2.0.2 错误修复
     
    • JDK-8149811:TZUpdater 工具从 Java 7 中删除了 PST 时区
     
  • 2.0 增强功能
     
    • 新增了 TZUpdater 功能:按需更新时区

      从 2.0 版开始,“-l”选项允许用户指向 IANA 信息库并按需获取编译新 tzdata 源所需的工具。

      如果 -l 选项中指定了 http 或 https 协议,该工具还会引用 https 资源网站以获取 SHA-512 散列值。

      因此,任何使用代理访问的环境在运行此工具时均需设置 http 和 https 代理值。

        HTTP: -Dhttp.proxyHost, -Dhttp.proxyPort
        HTTPS : -Dhttps.proxyHost, -Dhttps.proxyPort
         

      如果该工具无法连接到指定资源,将引发套接字异常:

      Network issue while connecting to http resource. Please reference 
      tzupdater README.

      将对下载的 tzdata 包执行自动 SHA-512 哈希检查以验证完整性。如果 SHA-512 散列值与预期不符,该工具将退出。

 
重写 SHA-512 哈希检查

可能有些情况下有新的 tzdata 版本可用,但 Oracle 尚未用新的 SHA-512 散列值更新 https 资源网站。

在此类情况下,用户将看到以下异常消息:

No SHA-512 hash file found:
https://javadl-esd-secure.oracle.com/update/tzupdater/tzdata2014a.tar.gz.sha512. 
If using http(s) resource location, the file may not yet be available.


Please reference tzupdater README

用户在此情况下可以选择将新的 -l 选项与 file:// 协议结合使用,可在其中指定自己的本地 SHA-512 散列值:

  • 将所需 tzdata.tar.gz 包副本下载到本地目录。
  • 计算该 tar.gz 包的 SHA-512 散列值,并在这个本地目录中创建一个单行文件,其中包含该 SHA-512 散列值。文件名必须在包含 tzdata 规则的包的原始名称之后附加“.sha512”。

    例如,如果您将 tzdata2014a.tar.gz 下载到本地目录,则该目录中必须存在一个名为 tzdata2014a.tar.gz.sha512 的文件,且该文件必须包含与 tzdata2014a.tar.gz 文件对应的 SHA-512 散列值。

  • 使用 file:// 协议应用新的时区数据。例如,如果将 tzdata2014a.tar.gz 下载到 /tmp 目录并创建了必需的 /tmp/tzdata2014a.tar.gz.sha512 文件,其中包含一行 sha512 散列值,则可使用以下命令运行 tzdata 更新:
    java -jar tzupdater.jar -l file:///tmp/tzdata2014a.tar.gz 
    

    (添加 -v 选项可获取详细输出)
 
已知限制

由于 TimeZone API 和实现约束,该工具有一些限制。

  • 时区显示名称
     
    该工具不会更新全新或有与显示名称相关的更改的时区的显示名称。全面支持所有时区显示名称需要安装新的 Oracle Java SE 平台 JDK/JRE 更新版本。
     
  • 系统级用法
     
    在已安装的 JDK/JRE 软件映像上运行 TZUpdater 工具之前,必须先停止基于该 JDK/JRE 软件运行的所有实例。
     
    系统可能出现 JDK/JRE 软件映像多个副本共生的情况,因而您可能需要对每个 JDK/JRE 软件映像分别应用该工具。下面显示了如何在 Unix 衍生系统上找到多个已安装的 JDK/JRE 软件副本。Microsoft Windows 用户可以使用桌面搜索实用程序。
     
    1. 在 Unix 衍生系统上找到本地安装的 JDK/JRE 软件实例:
       
      /usr/bin/find  
                                  
      DIRPATH
      -fstype nfs -prune -o -fstype autofs -prune -o -name java -print -exec {} -version \;
       
      其中,DIRPATH 是要搜索已安装的 Java SE 平台实例的目录路径,例如 /usr
       
    2. 自动更新本地安装的实例:
       
      /usr/bin/find  
      
      DIRPATH
      -fstype nfs -prune -o -fstype autofs -prune -o -name java -print -exec {} -jar /
      ABSOLUTEPATH
      /tzupdater.jar -l \;
       
      其中,DIRPATH 是要搜索已安装的 Java SE 平台实例的目录路径,例如 /usrABSOLUTEPATH 应替换为 tzupdater.jar 的解压目录的完整路径名称。
       
  • Solaris 上受限的 umask 设置
     
    TZUpdater工具创建具有默认文件权限的文件。在 Solaris 操作系统上,此权限来自 umask。运行 TZudpater 工具时应使用默认的 umask 值 022。限制性更强的 umask(如 umask 077)将意味着其他用户不能读取该工具创建的文件。
系统特定的安装信息

TZUpdater 是一个纯 Java 工具,它不能解决平台特定的软件管理问题。例如,在 Windows 系统上,这意味着无法在卸载时删除该工具创建的其他文件和备份文件。要卸载经过更新的 JRE 软件,请在卸载程序完成之后立即检查 JRE 软件的安装目录并手动删除。

对于 Solaris 系统,其更新的 JRE 软件是以 Solaris 软件包的形式存在的(如在 /usr/j2se/usr/jdk/ 实例中),这已经意味着 pkgchk 命令将更改作为错误或不一致突出显示。从 TZUpdater 1.1.0 版开始,该工具将运行一系列附加的软件包管理命令,以根据需要更新软件包数据库。

在 Solaris 10 系统上,TZUpdater 的初始版本已经更新了现有的基于软件包的 JRE 软件,并且已经创了建区域,区域将包含与全局区域相同的 pkgchk 错误。在区域创建过程中,将在区域安装命令结束时突出显示这些 pkgchk 错误。

为解决 Solaris 软件包数据库错误,请执行以下步骤。但如果您运行的不是 Solaris 10 系统或者系统上没有区域,则只需执行第 1 步。如果系统是 Solaris 10 系统并有其他区域,则仅在全局区域执行第 1 步并按照第 2 步和第 3 步操作。

  1. 请运行 TZUpdater 的当前版本,并使用 -f force 选项对先前更新过的 JRE 软件实例重新应用时区更新。将进行更新,并执行其他软件包解析命令。更新必须以 root 用户身份执行,且仅在 Solaris 10 系统中才针对全局区域。

  2. 对于包含区域的系统,请从 tzupdater.jar 文件解压缩 pkg_resolve.sh 脚本
    /bin/jar xf tzupdater.jar pkg_resolve.sh
    
     
  3. 在有基于软件包的 Java 平台的安装区域中,执行该脚本。您必须以 root 身份运行脚本:
    /bin/ksh ./pkg_resolve.sh JAVA_PATH
    
     
    例如:
    /bin/ksh ./pkg_resolve.sh /usr/jdk/instances/jdk1.8.0/bin/java
    
     

:对软件包系统的更新将从软件包数据库删除许多文件并重新插入,因此可能需要长达 15 分钟。

删除 TZUpdater 工具更改

在已安装的 JDK/JRE 软件映像上运行 TZUpdater 工具之前,必须先停止基于该 JDK/JRE 软件运行的所有实例。

目前尚无用于删除 TZUpdater 修改的选项。您可以执行以下步骤手动删除当前 TZUpdater 工具所做修改。

对于 JDK 7 及早期系列版本:

  • 在修改的 JAVAHOME/jre/lib 目录下找到“zi”目录。这是更新的数据文件。
  • 在同一 JAVAHOME/jre/lib 目录中找到“zi.tzdata*”目录。这是被替换的旧数据。
  • 通过 java -jar tzupdater.jar -V 命令获取当前安装的时区数据版本。
  • 将当前“zi”目录重命名为“zi.tzdata2016b”之类,或第 3 步中的命令指定的任何版本。确保这不会与旧的数据目录冲突。
  • 将旧数据目录重命名为“zi”。
  • 通过执行 java -jar tzupdater.jar -V 验证当前活动时区数据中的更改。
  • 根据需要在此 JDK/JRE 实例上重新启动应用。

对于 JDK 8 及之后的系列版本:

  • 在修改的 JAVAHOME/jre/lib 目录下找到“tzdb.dat”文件。这是更新的数据文件。
  • 在同一 JAVAHOME/jre/lib 目录中找到“tzdb.dat.<oldtzdataversion>”文件。这是被替换的旧数据文件。
  • 通过 java -jar tzupdater.jar -V 命令获取当前安装的时区数据版本。
  • 将当前的“tzdb.dat”文件重命名为“tzdb.dat.<newtzdataversion>”或者第 3 步中的命令指定的任何版本。确保此名称不会与旧的数据文件冲突。
  • 将旧数据文件重命名为“tzdb.dat”。
  • 通过执行 java -jar tzupdater.jar -V 验证当前活动时区数据中的更改。
  • 根据需要在此 JDK/JRE 实例上重新启动应用。
更多信息

以下链接指向 Oracle Corporation 提供的有关时区及 DST 更改以及它们对 Java 平台和其他 Oracle 产品的影响的信息:

以下外部链接提供了有关时区和 DST 的一般信息: