を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の生成中に動的に適用することができます。
私はコードの理解から '/ etc/timezone'ファイルを使います。 – Petesh
'java.util.Date'には内部タイムゾーンはありませんが、' date.toString() 'メソッドを使ってコードが実行されている場合は、そのコードが実行されるJVMのタイムゾーンのみが使用されます。必要な時間帯にオブジェクトを印刷するのに適したフォーマッタを使用してください。 –
Linuxでは、 'TZ'変数が設定されておらず、'/etc/sysconfig/clock'に 'ZONE'エントリがない場合、'/etc/localtime'を使用します(Red Hatでは、それは)ですが、おそらく[このバグ](https://bugs.openjdk.java.net/browse/JDK-6456628)はあなたのケースに関係しています(わからない)。あるいは、JVMを再起動しなかったかもしれないので、新しい設定を取得しませんでした。あるいは、コードは 'user.timezone'プロパティを設定したJVMで動作しています。これはシステムの設定よりも優先されます。 –