JREでは、デフォルト・タイムゾーンを判別するためにネイティブ・タイムゾーン情報を読み取ります。たとえば、Windowsでは、JREはデフォルト・タイムゾーンを判別するためにレジストリを問い合わせます。
しかし、JREでは独自のタイムゾーン・データベースも保持しています。これにはクロスプラットフォーム・サポートが備わっていますが、その理由は様々なオペレーティング・システムのAPIがJava APIをサポートするのに不十分であるからです。Javaタイムゾーン・データベースは、タイムゾーンIDをサポートし、JREがサポートしているすべてのタイムゾーンの夏時間ルールを決めます。Javaタイムゾーン・データベースは、<install_dir>/jre/lib/zi
にあります。Javaタイムゾーン・データベースの更新には、tzupdater
ツールを使用できます。
オペレーティング・システムがシステム時間をJREに配信できるように、JREへの変更をオペレーティング・システムごとに行う必要があります。その後、Javaアプリケーションが日付と時間に関連したコンストラクタを呼び出してシステム日付を要求すると、システム時間が返されます。
そのようなコンストラクタの例を次に示します。
java.util.Date()
java.util.GregorianCalendar()
日付と時間に関連したコンストラクタには、次が含まれています。
System.currentTimeMillis()
System.nanoTime()
正しいシステム時間が必ずJREに配信されるようにするには、オペレーティング・システム固有のパッチが必要になる場合があります。
次の項では、タイムゾーンの設定のトラブルシューティング手法について説明します。
Oracle提供のJREに付属しているタイムゾーン・データベースのバージョンは、リリース・ノートに記載されています。ただし、tzupdater
ツールを使用してJREにパッチを適用した場合は、実際のバージョンがそこに記載されているバージョンと異なることがあります。
使用しているJREの現在のタイムゾーン・データ・バージョンを判別するには、Versionオプションを指定してtzupdater
ツールを実行するか、ZoneInfoMappings
ファイルのヘッダーを調べます。
タイムゾーン・データを確認するには、これらの2つの手順に従います。
TZupdaterによるタイムゾーンの確認: Javaのタイムゾーン更新ツールはtzupdater
と呼ばれています。使用しているJREのタイムゾーン・データベース・バージョンを判別するには、このツールを次のように実行します。
java -jar tzupdater.jar -V
tzupdater
ツールの実行による標準的な出力を次に示します。
tzupdater version 1.3.33-b01JRE time zone data version: tzdata2010iEmbedded time zone data version: tzdata2010l
tzupdater
ツールは、http://www.oracle.com/technetwork/jp/java/javase/tzupdater-readme-136440.html
というWebページからダウンロードできます。
ZoneInfoMappingsファイルの確認: tzupdater
ツールがない場合でも、<java-home>/lib/zi/ZoneInfoMappings
ファイルのヘッダーを調べることでバージョンをすぐに確認できます。このデータは、Javaに固有のバイナリ・フォーマットで保存されます。Oracle Solaris、LinuxおよびMac OS Xオペレーティング・システムでは、8進数のダンプ・コマンドを使用してこのファイルのヘッダーを調べることができます。
例8-1に、8進数ダンプ・コマンド形式を示します。
例8-2に、このようなダンプ・コマンドの一般的な結果を示します。
例8-2 8進数ダンプ・コマンドの結果
/usr/bin/od -c -j 11 -N 11 /farfaraway/jdks/jdk1.6.0_21/jre/lib/zi/ZoneInfoMappings0000000 t z d a t a 2 0 1 0 i0000013
例8-3では、このJREに埋め込まれているタイムゾーン・データのバージョンはtzdata2010i
であることを示しています。
Microsoft Windowsでは、findstr
コマンドを使用してZoneInfoMappings
ファイルを調べることができます。次に例を示します。
tzupdater
の実行時に、それが「このJavaランタイムで使用できるタイムゾーン・データはありません」というメッセージを表示して終了することがときどきあります。例8-4に、2つの例を示します。
例8-4 メッセージとともに終了するtzupdater
$ java -jar tzupdater.jar -Vtzupdater version 1.3.39-b01JRE time zone data version: tzdata2009iThere's no tzdata available for this Java runtime.
$ java -jar tzupdater.jar -u There's no tzdata available for this Java runtime.
考えられる原因は、Oracle提供でないJREを使用していることです。Oracleが提供するJREは、Oracle Solaris (x86、x64、SPARC)、Linux (x86、x64、ARM)、Microsoft Windows (x86、x64)、およびMac OS X (x64)用です。これらのJREのjava.vendor
プロパティ値はSun Microsystems Inc.、Oracle Corporation、またはBEA Systems, Inc.です。Oracleでは、それ以外のプラットフォーム用のJREを提供していません。
java -version
コマンドを実行した場合の出力は、JREの実際のベンダーを判断するのに十分な情報を提供しません。しかし、-v
オプションを指定してtzupdater
を更新モードで実行すると、java.vendor
プロパティが出力されます。例8-5に、環境がHewlett PackardのHP_UXである場合のtzupdaterの実行の試みを示します。
例8-5 HP_UX環境でのtzupdaterの実行
root@my_server:/opt/java6/bin> uname -a HP-UX my_server B.11.23 U ia64 1114591084 unlimited-user license root@my_server:/opt/java6/bin> ./java -version java version "1.6.0.05" Java(TM) SE Runtime Environment (build 1.6.0.05-jinteg_14_oct_2009_01_44-b00) Java HotSpot(TM) Server VM (build 14.2-b01-jre1.6.0.05-rc5, mixed mode) root@my_server:/opt/java6/bin> ./java -jar tzupdater.jar -v -u java.home: /opt/java6/jre java.vendor: Hewlett-Packard Co. java.version: 1.6.0.05 JRE time zone data version: tzdata2009i There's no tzdata available for this Java runtime.
例8-5では、java.vendor
がHewlett-Packard Co.に設定されています。tzupdater
を使用して更新を試みているJREはOracleでサポートされていません。
考えられる解決方法は、使用しているJREベンダーのWebサイトを参照して、使用可能なタイムゾーン更新ツールがあるかどうかを確認することです。たとえば、Hewlett-Packardバージョンのtzupdaterツールを参照します。