JVM TimeZoneを適切に設定する方法


141

Javaプログラムを実行しようとしていますが、OSで定義されているタイムゾーンではなく、デフォルトのGMTタイムゾーンを使用しています。私のJDKバージョンは1.5で、OSはWindows Server Enterprise(2007)です。

Windowsには中央タイムゾーンが指定されていますが、次のプログラムを実行すると、GMT時間になります。

import java.util.Calendar;

public class DateTest
{
    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        System.out.println(now.getTimeZone());
        System.out.println(now.getTime());
    }
}

これが出力です

sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010

アプリケーションからタイムゾーンを設定したくないことに注意してください。JVMで使用されるタイムゾーンは、OSで指定されたものである必要があります。(JDKのバージョン1.4およびMicrosoft Server 2003を搭載した他のサーバーでは、この問題は見つかりません)。

どんな考えでも大歓迎です。


1
うーん、それは奇妙です。JVM / OSのバグまたは奇妙な設定ミスのようです。
Michael Borgwardt

どのようにDateTestクラスを呼び出していますか?
matt b

@matt b:WindowsコマンドプロンプトからDateTestをコンパイルして呼び出しています。しかし、これは単なるTestクラスです。元々の問題は、IBM cognosサーバーの一部のETLプロセスにありました。
Kushal Paudyal、2010年

1
-Duser.timezone値に沿って渡される可能性のあるシェル/バッチスクリプトを介して起動することを除外したかっただけです
matt b

回答:


220

JVMにこのパラメータを渡すことができます

-Duser.timezone

例えば

-Duser.timezone=Europe/Sofia

これでうまくいくはずです。Linuxでは、環境変数TZを設定することでも同じことができます。


JDK DST Timezone Update Tool-1.3.25(tzupdater)を使用してから、JVMパラメーターを提案どおりに変更する必要があり、最終的に問題を解決しました。ちなみに、タイムゾーン情報はWindowsによっていくつかのレジストリに保存されます。私が使用したアップデーターは、レジストリー値も更新しました。
Kushal Paudyal

1
このパラメーターを使用してJVMを起動しようとしていますが、変更がないようです... UTCで起動したい場合は、パラメーターとして何を使用しますか?
rafa.ferreira

私のアプリケーションでは、いくつかの場所を変更し、その場所のタイムゾーンを取得しています。タイムゾーンを使用してさらに処理しています。しかし、アプリケーションが初めて起動したとき、正しい値を取得しています。TimeZoneを変更し、新しいタイムゾーンをデフォルトのタイムゾーンとして設定すると、正しい値が得られません。問題は何ですか?タイムゾーンを正確に変更する方法。TimeZone.setDefault(TimeZone.getTimeZone( "my_time_zone"));を使用してタイムゾーンを変更しています。
Dray、2012

2
TZのタイムゾーンのリストはこちら:en.wikipedia.org/wiki/List_of_tz_database_time_zones。タイムゾーン名を使用すると、夏時間を処理するため、オフセットよりも優れています。
ブライアン

65

次のコードを使用して、コードにデフォルトのタイムゾーンを設定することもできます。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

あなたに

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));

1
「アプリケーションからタイムゾーンを設定したくないので注意してください。」
AbVog 2017年

22

上記の受け入れられた答え:

-Duser.timezone="Europe/Sofia" 

正確には機能しませんでした。パラメータを引用符で囲まなかった場合のみ、タイムゾーンを正常に変更できました。

-Duser.timezone=Europe/Sofia

2
同意する。元の回答を編集して引用を削除しました。
GaZ

1
これは使用するシェルによって異なります。
vadipp '11 / 10/19

10

Windows 7およびJDK6の場合-Duser.timezone="Europe/Sofia"JAVA_TOOL_OPTIONSに追加する必要がありました「My computer => Properties => Advanced System Settings => Environment Variables」の下システム変数に。

すでにJAVA_TOOL_OPTIONSスペースを追加する他のプロパティセットがある場合は、スペースを追加してからプロパティ文字列を挿入します。


5

他の回答ではカバーされていないと思う2つのオプション:

必要を避ける

JVMのデフォルトのタイムゾーンを設定するために何をするにしても、他の人が別の方法で設定しないようにするのは非常に困難です。これは、プログラムの別の部分または同じJVMで実行されている別のプログラムからいつでも通知なしで設定できます。そのため、時間の操作では、希望するタイムゾーンを明示する必要があり、JVMの設定とは関係なく、何が得られるかを常に知ることができます。例:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

出力例:

2018-10-11T14:59:16.742020 + 05:00 [アジア/ドゥシャンベ]

System.setProperty

多くの目的のために、以下は推奨される方法ではなく、間違いで誤用される可能性があります。「捨てる」プログラムの場合、私はそれが実用的であると感じることがあります。Java内からシステムプロパティを設定することもできます。

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

これは印刷したばかりです:

2018-10-11T21:03:12.218959 + 11:00 [オーストラリア/タスマニア]

渡す文字列の検証が必要な場合は、次を使用します。

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());

4

Mavenを使用している場合:

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."

mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"Spring Boot v1の場合。
クロエ

0

win7では、正しいタイムゾーンをJREのパラメーターとして設定する場合deployment.propertiesは、パスに保存されているファイルを編集しc:\users\%username%\appdata\locallow\sun\java\deploymentて、文字列my_time_zoneを追加する必要がありますdeployment.javaws.jre.1.args=-Duser.timezone\=


試してみましたが、機能しません(intellij内からjvmを実行しました)
kumetix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.