それぞれ異なるTimeZoneを持つ2つの異なるコンピューターがあります。
1台のコンピューターでSystem.currentTimeMillis()
を印刷してから、両方のコンピューターで次のコマンドを印刷します。System.out.println(new Date(123456));
-> 123456は、コンピューター#1のcurrentTimeMillis
にある番号を表します。
2番目の印刷(ハードコードされたタイプですが)は、両方のコンピューターで異なる印刷になります。何故ですか?
ちょっとした細部についてはどうでしょう。
Java.util.Date はタイムゾーンに依存しません。 javadocでそう言っています。
特定のタイムゾーンに関して何かが必要ですか? Java.util.Calendar です。
トリッキーな部分?このものを( Java.text.DateFormat または サブクラス で)印刷すると、カレンダー(タイムゾーンを含む)が関係します。 DateFormat.setTimeZone() を参照してください。
Java.util.Date.toString()がDateFormatを通過するように見えます(実装を確認していません)。そのため、(ほとんど)タイムゾーンに依存しないクラスでさえ、タイムゾーンで混乱します。
純粋なゾーンレスDateオブジェクトからそのタイムゾーンを取得したいですか? Date.toGMTString() があります。または、独自のSimpleDateFormatterを作成し、setTimeZone()を使用して自分で使用するゾーンを制御できます。
何故ですか?
「2009年10月4日、14:20」のようなものは、それが参照するタイムゾーンを知らなくても意味がないためです。同じ時間であるにもかかわらず。
コンピューターのタイムスタンプは通常UTC(基本的にはイギリスのグリニッジのタイムゾーン)で測定され、タイムゾーンは人間が読める形式にフォーマットする際に考慮する必要があります。
そのミリ秒数は、1970年1月1日UTCからのミリ秒数であるためです。その後、別のタイムゾーンに変換すると、レンダリングされる時間は異なります。
例えば123456はグリニッジの正午(UTC)に対応する場合があります。しかし、それはニューヨークでは別の時代になるでしょう。
これを確認するには、タイムゾーン出力で SimpleDateFormat を使用するか、2番目のコンピューターのタイムゾーンを最初のコンピューターと一致するように変更します。
system.currentTimeMillis()javadocはこれをよく説明しています。戻り値の時間の単位はミリ秒ですが、値の粒度は基礎となるオペレーティングシステムに依存し、より大きくなる可能性があることに注意してください。たとえば、多くのオペレーティングシステムは、数十ミリ秒単位で時間を測定します。
https://docs.Oracle.com/javase/7/docs/api/Java/util/Date.html#toString() を参照してください。
はい、タイムゾーンを使用しています。また、それらを印刷する必要があります(年の前の3文字)。