このセクションでは、Windows VistaおよびWindows 7オペレーティング・システムでJREがデフォルト・タイムゾーンを判別する方法について明確に説明します。Javaが期待されたタイムゾーンを報告しない場合は、次の各セクションで説明するトラブルシューティング方法を使用してください。
ネイティブ・オペレーティング・システムによるチェックに基づいて、JREがデフォルト・タイムゾーンとして報告するタイムゾーンを確認するための簡単なプログラムを作成できます。
例8-6のJavaプログラムはデフォルト・タイムゾーンを返します。
例8-6 JREでのタイムゾーン設定を確認するためのJavaコードの抜粋
public class DefaultTimeZone { public static void main(String[] args) { System.out.println(java.util.TimeZone.getDefault().getID()); } }
例8-6のコードの抜粋をDefaultTimeZone.java
という名前のファイルに保存し、javac
コマンドを使用してコンパイルすることができます。これにより、例8-7
に示すように、コンパイルしたDefaultTimeZoneクラスを実行できます。
例8-7 DefaultTimeZoneプログラムのコンパイルと実行
c:\tztest> javac DefaultTimeZone.java c:\tztest> java DefaultTimeZone Europe/Berlin
例8-7では、デフォルト・タイムゾーンはEurope/Berlinです。プログラムを実行すると、ローカル・タイムゾーンが表示されるはずです。出力が予期されたタイムゾーンでない場合は、次のトラブルシューティング手順を続けて実行してください。
Windowsコントロール・パネルを使用して、システムのデフォルト・タイムゾーンを変更または確認できます。たとえば、Windows 7で次のタイムゾーン設定を選択できます。
(UTC+01:00)アムステルダム、ベルリン、ベルン、ローマ、ストックホルム、ウィーン
対応するTimeZoneKeyName
レジストリ・キーの値は、西ヨーロッパ標準時間です。
グラフィカル・ユーザー・インタフェース(GUI)またはWindowsレジストリを通じて、夏時間の自動調整が有効かどうかを確認できます。
GUIによる方法: コントロール・パネルを使用して夏時間の自動調整が有効かどうかを確認するには、次の手順に従います。
Windowsの「スタート」ボタンをクリックしてから、「コントロール パネル」をクリックします。
「日付と時刻」をクリックします。
「タイム ゾーンの変更」ボタンをクリックします。
「自動的に夏時間の調整をする」というラベルの付いたクリック・ボックスが表示されます。このクリック・ボックスがクリックされているかどうかを確認し、必要に応じて設定を変更します。
「OK」をクリックします。「日付と時刻」ダイアログ・ボックスに戻ります。
Windowsレジストリによる方法: Windowsレジストリ・エディタを実行して夏時間の自動調整が有効かどうかを確認できます。
注意: Windowsレジストリを確認または編集する前にバックアップを取っておくことをお薦めします。編集の際に間違えると、Windowsレジストリが損なわれる可能性があります。 |
Windowsレジストリから夏時間の自動調整を有効にするには:
Windowsの「スタート」ボタンをクリックします。
「プログラムとファイルの検索」フィールドで、「regedit」と入力してから[Enter]キーを押して、レジストリ・エディタを開きます。
レジストリ・エディタで、DynamicDaylightTimeDisabledというキーを探し、その設定を調べます。
レジストリ設定が1の場合、動的な夏時間は無効になっています。
レジストリ設定が0の場合、動的な夏時間は有効になっています。
お好みで、Windowsコマンド・ウィンドウからWindowsレジストリにアクセスすることもできます。
例8-8では、レジストリ設定は1です。この設定では、時計は夏時間に合わせて自動的に調整されません。
例8-8 trueに設定されているDynamicDaylightTimeDisabledレジストリ・キー
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] "DynamicDaylightTimeDisabled"=dword:00000001
DynamicDaylightTimeDisabled
オプションを無効にした場合、Javaは常にGMT (グリニッチ標準時間)オフセットを返し、統一されたネーミング規則と互換性のあるタイムゾーンID(Europe/Berlinなど)を返しません。たとえば、このオフセットはEurope/BerlinではなくGMT+01として表されます。
Windowsコントロール・パネルを使用して、システムのデフォルト・タイムゾーンを変更または確認できます。
コントロール・パネルからシステムのデフォルト・タイムゾーンを設定するには:
Windowsの「スタート」ボタンをクリックしてから、「コントロール パネル」をクリックします。
「日付と時刻」をクリックします。
「タイム ゾーンの変更」ボタンをクリックします。
「タイム ゾーン」メニューから、希望するタイムゾーンを選択します。
「OK」をクリックします。「日付と時刻」ダイアログ・ボックスに戻ります。
「OK」をクリックして「日付と時刻」ダイアログ・ボックスを閉じます。
たとえば、Windows 7で次のタイムゾーンを選択できます。
(UTC)+1:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna.
対応するTimeZoneKeyName
レジストリ・キーの値は、西ヨーロッパ標準時間です。
user.timezone
と呼ばれるJavaシステム・プロパティを使用することにより、コマンド行でデフォルト・タイムゾーンを明示的に設定できます。これにより、Windowsオペレーティング・システムでの設定が省略され、場合によっては回避方法となることもあります。たとえば、システム上で実行されている1つのJavaプログラムでのみDST (夏時間)を適用する場合にこの設定が役立ちます。
次の例では、Windowsの「コマンド プロンプト」ウィンドウからDefaultTimeTestZoneと呼ばれるJavaプログラムを実行することで、-Duser.timezoneシステム・プロパティを調べます。
c:\tztest> java -Duser.timezone=America/New_York DefaultTimeZone
America/New_York
-Duser.timezone
を指定することでデフォルト・タイムゾーンを明示的に設定することがDefaultTimeTestZone
プログラムには有効だが、使用しているプログラムには有効でない場合、実行時に次のようなメソッド呼出しを使用してコードがデフォルトのJavaタイムゾーンを上書きするかどうかを確認するようにしてください。
TimeZone.setDefault(TimeZone zone)
Windows 7では、tzutil.exe
と呼ばれるツールを使用できます。このツールを使用すると、手動でレジストリを確認することなく、現在のタイムゾーンIDの略称を要求できます。
tzutil.exe
の実行例を次に示します。最初の行は、Windowsの「コマンド プロンプト」ウィンドウで入力するコマンドです。2番目の行はシステム・レスポンスです。
tzutil /g W. Europe Standard Time
Windowsでは、JREは<java-home>\lib\tzmappings
ファイルを使用してWindowsタイムゾーンとJavaタイムゾーンのマッピングを表現します。このファイルの各行には4つのトークンがあります。最初のトークンは、TimeZoneKeyName
と呼ばれるWindowsタイムゾーンのレジストリ・キーです。「コントロール・パネルでの設定の確認」を参照してください。
2番目のトークンは、タイムゾーン・マップIDです。(これはWindows VistaおよびWindows 7では使用されません。)3番目のトークンはロケールです。4番目のトークンはJavaタイムゾーンIDを表しています。重要なトークンは、1番目、3番目(空の場合もある)、および4番目のトークンです。(注意: このファイルはパブリック・インタフェースではありません。)
Windowsのコントロール・パネルで「(UTC+01:00)アムステルダム、ベルリン、ベルン、ローマ、ストックホルム、ウィーン」と呼ばれるタイムゾーンを選択した場合、tzmappings
ファイルの関連する行は次のようになります。
W. Europe Standard Time:2,3::Europe/Berlin:
この例では、JREはデフォルトのタイムゾーン(4番目のトークン)をEurope/Berlinと認識します。
tzmappingsファイルに適切なマッピング・エントリが存在しない場合、MicrosoftがWindows更新で新しいタイムゾーンを導入したが、その新しいタイムゾーンがJREで使用できない可能性があります。この場合、JREのバグ・レポートを提出し、オラクルのJavaバグWebサイトからtzmappingsファイルの新しいエントリを要求することができます。
tzedit.exe
ツールを実行した場合も、オペレーティング・システムとJREの間で似たようなずれが生じる可能性があります。このツールはMicrosoft社によってインターネット上に掲示されているため、ユーザーは新しいタイムゾーンを追加できます。JREで、このツールによってタイムゾーンがシステムに導入される可能性はありません。この場合も、解決方法はバグを提出して、新しいエントリがtzmappings
ファイルに追加されるように要求することです。