web-dev-qa-db-ja.com

Java.util.DateはTimeZoneを使用していますか?

それぞれ異なるTimeZoneを持つ2つの異なるコンピューターがあります。

1台のコンピューターでSystem.currentTimeMillis()を印刷してから、両方のコンピューターで次のコマンドを印刷します。System.out.println(new Date(123456));-> 123456は、コンピューター#1のcurrentTimeMillisにある番号を表します。

2番目の印刷(ハードコードされたタイプですが)は、両方のコンピューターで異なる印刷になります。何故ですか?

23
Udi

ちょっとした細部についてはどうでしょう。

Java.util.Date はタイムゾーンに依存しません。 javadocでそう言っています。

特定のタイムゾーンに関して何かが必要ですか? Java.util.Calendar です。

トリッキーな部分?このものを( Java.text.DateFormat または サブクラス で)印刷すると、カレンダー(タイムゾーンを含む)が関係します。 DateFormat.setTimeZone() を参照してください。

Java.util.Date.toString()がDateFormatを通過するように見えます(実装を確認していません)。そのため、(ほとんど)タイムゾーンに依存しないクラスでさえ、タイムゾーンで混乱します。

純粋なゾーンレスDateオブジェクトからそのタイムゾーンを取得したいですか? Date.toGMTString() があります。または、独自のSimpleDateFormatterを作成し、setTimeZone()を使用して自分で使用するゾーンを制御できます。

49
John M

何故ですか?

「2009年10月4日、14:20」のようなものは、それが参照するタイムゾーンを知らなくても意味がないためです。同じ時間であるにもかかわらず。

コンピューターのタイムスタンプは通常UTC(基本的にはイギリスのグリニッジのタイムゾーン)で測定され、タイムゾーンは人間が読める形式にフォーマットする際に考慮する必要があります。

7

そのミリ秒数は、1970年1月1日UTCからのミリ秒数であるためです。その後、別のタイムゾーンに変換すると、レンダリングされる時間は異なります。

例えば123456はグリニッジの正午(UTC)に対応する場合があります。しかし、それはニューヨークでは別の時代になるでしょう。

これを確認するには、タイムゾーン出力で SimpleDateFormat を使用するか、2番目のコンピューターのタイムゾーンを最初のコンピューターと一致するように変更します。

5
Brian Agnew

system.currentTimeMillis()javadocはこれをよく説明しています。戻り値の時間の単位はミリ秒ですが、値の粒度は基礎となるオペレーティングシステムに依存し、より大きくなる可能性があることに注意してください。たとえば、多くのオペレーティングシステムは、数十ミリ秒単位で時間を測定します。

2
lwpro2

https://docs.Oracle.com/javase/7/docs/api/Java/util/Date.html#toString() を参照してください。

はい、タイムゾーンを使用しています。また、それらを印刷する必要があります(年の前の3文字)。

2
svens