2017-10-24 20 views
-2

私はへのリンク/etc/localtimeを変更する場合でも、私はSystem.out.println(new Date())を使用する場合しかし、それは常に同じタイムゾーン(EAT)を印刷し、Linuxマシン上でJavaプログラムを実行していますよ異なるタイムゾーンであり、dateコマンドは正しいタイムゾーン(/etc/localtimeで参照されるタイムゾーン)を表示します。 Date.toString()は、ホストOSのタイムゾーンと同じでなければならないjavaのデフォルトタイムゾーンを使用していますが、私の場合、JVMのデフォルトタイムゾーンは決して変更されないため、これは起こりません。 私の質問は次のとおりです。Javaはどこからデフォルトのタイムゾーンを取得しますか?私はどのファイルまたは環境変数ですか?変更OSのタイムゾーンは変更されませんJVMのデフォルトのタイムゾーン

私は、Red Hat Enterprise Linux Serverは6.5(サンティアゴ)を放出し、これは、すべてのスタックオーバーフローの上に何度もカバーし、ので、より多くの情報を検索された1.7

+1

私はコードの理解から '/ etc/timezone'ファイルを使います。 – Petesh

+4

'java.util.Date'には内部タイムゾーンはありませんが、' date.toString() 'メソッドを使ってコードが実行されている場合は、そのコードが実行されるJVMのタイムゾーンのみが使用されます。必要な時間帯にオブジェクトを印刷するのに適したフォーマッタを使用してください。 –

+1

Linuxでは、 'TZ'変数が設定されておらず、'/etc/sysconfig/clock'に 'ZONE'エントリがない場合、'/etc/localtime'を使用します(Red Hatでは、それは)ですが、おそらく[このバグ](https://bugs.openjdk.java.net/browse/JDK-6456628)はあなたのケースに関係しています(わからない)。あるいは、JVMを再起動しなかったかもしれないので、新しい設定を取得しませんでした。あるいは、コードは 'user.timezone'プロパティを設定したJVMで動作しています。これはシステムの設定よりも優先されます。 –

答えて

3

をOpenJDKの使用しています。

簡単に言うと...

いいえ、java.util.Dateは、タイムゾーンを持っていませありません。常にUTCです。残念なことに、そのtoStringメソッドは、賢明ではあるが意地悪ではないアンチフィーチャであるStringを生成しながら、JVMの現在のデフォルトタイムゾーンを動的に適用します。もっと紛らわしいのは、実際にjava.util.Dateクラス内に埋め込まれたタイムゾーンであるですが、この議論とは無関係です。混乱している?確かに。これらの古い日時クラスは、貧弱なデザインのひどい混乱です。

これらの面倒な古い日時クラスは避けてください。それらは今や古くなり、java.timeクラスに取って代わられています。 Dateの代わりにjava.time.Instantを使用してください。他のゾーンについては、ZoneIdを適用してZonedDateTimeを取得してください。

私の質問は:Javaは

からデフォルトのタイムゾーンを取得しない場所のJavaの実装に依存します。

一般的に、デフォルトでは、ホストオペレーティングシステムの現在のデフォルトタイムゾーンを検出し、これをJVMの現在のデフォルトタイムゾーンとしてコピーします。 JVMが起動されると、2つのJVMが分離されます。ホストOSは、JVMに影響を与えることなく、デフォルトのタイムゾーンを変更する可能性があります。また、JVMはホストOSに影響を与えずに現在のデフォルトのタイムゾーンを変更することがあります。しかし、やはり、この動作は、私が知る限り実装依存であり、JVM specificationでは必須ではありません。

起動時に引数がJVMに渡されると、デフォルトのタイムゾーンが設定され、ホストOSのデフォルトの検出が無効になります。

注意:実行時に予測できない - JVM内の任意のアプリケーションの任意のスレッドのコードは、いつでもJVMの現在のデフォルトタイムゾーンを変更し、そのJVMのすべてのアプリケーションのすべてのコードに即座に影響します。

これらの理由から、デフォルトのタイムゾーンによっては賢明ではないことがわかります。希望の/期待されるタイムゾーンを明示的に指定するには、オプションのZoneId引数を常に渡すことをお勧めします。

一般に、ベストプラクティスは、UTCで作業、思考、データの格納、およびデータの交換を行うことです。

Instant instant = Instant.now() ; // Always in UTC. 

他のタイムゾーンは、必要に応じてユーザーにプレゼンテーションなどを適用します。

ZoneId z = ZoneId.of("Africa/Casablanca") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

java.timeクラスは、文字列を生成または解析する際に標準のISO 8601形式を使用します。他の形式については、DateTimeFormatterクラスを使用してください。オプションで、フォーマッタのタイムゾーンを設定して、Stringの生成中に動的に適用することができます。

+0

私は、Dateクラスにはタイムゾーンがないことを知っています。私はより明確に私の質問を更新しました – monim

関連する問題