web-dev-qa-db-ja.com

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

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で指定されているものでなければなりません。 (バージョン1.4のJDKおよびMicrosoft Server 2003を持つ他のサーバーでこの問題は見つかりません)。

ご意見をいただければ幸いです。

120
Kushal Paudyal

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

-Duser.timezone

例えば

-Duser.timezone=Europe/Sofia

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

192
Bozhidar Batsov

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

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

あなたへ

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

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

-Duser.timezone="Europe/Sofia" 

私のために正確に動作しませんでした。パラメータの周りに引用符がない場合にのみ、タイムゾーンを正常に変更できました。

-Duser.timezone=Europe/Sofia
21
WN4yhihiY

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

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

10
VolkanT

Maven を使用している場合:

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

私が考えていない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());
2
Ole V.V.

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

0
Dave