2009-10-04 4 views
23

私は2台のコンピュータを持っていて、それぞれが異なるTimeZoneを持っています。その後、System.currentTimeMillis()を印刷1つのコンピュータイムでTimeZoneを使用してjava.util.Dateですか?

、そして両方のコンピュータで次のコマンドを出力します。 System.out.println(new Date(123456)); - 数について> 123456スタンドは、コンピュータ#1にcurrentTimeMillisに来ました。

両方のコンピュータで2番目のプリント(ハードコードされたものの)が異なるプリント結果になります。 なぜですか?

答えて

48

おとぎ話の詳細はどうですか?

java.util.Dateは、タイムゾーンに依存しません。 javadocでそうだと言います。

特定のタイムゾーンに関して何かしたいですか?それはjava.util.Calendarです。

トリッキーな部分はありますか?あなたが(java.text.DateFormatまたはsubclassで)このものを印刷するときには、カレンダー(タイムゾーンを含む)が必要です。 DateFormat.setTimeZone()を参照してください。

java.util.Date.toString()のようなものは、DateFormatを経由するように見えます(実装がチェックされていません)。だから、私たち(主に)タイムゾーンに依存しないクラスでさえ、タイムゾーンでうんざりしてしまいます。

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

+0

java.util.Dateは、タイムゾーンに多少依存します。 Java SDK7からのコピー&ペーストjava.util.Date.toString() 'TimeZone zi = date.getZone(); if(zi!= null){ sb.append(zi.getDisplayName(date.isDaylightTime()、zi.SHORT、Locale.US)); // zzz } else { sb.append( "GMT"); } '' date'はタイムゾーンが 'TimeZone.getDefaultRef()'に設定された 'BaseCalendar'です –

+1

キーポイントはあなたがtoString()メソッドについて話していることです。私はtoString()の実装を見ていないと言いましたが、カレンダーが関係していると思われました。あなたはただそれを確認しました。私たちの間に意見の相違はありません。 –

+1

'Date'オブジェクトはタイムゾーンを持つ' cdate'メンバ( 'BaseCalendar'です)で動作します。そして、誰も本当に気にしないものが起こります。あなたがそれを印刷しない限り、 'Date'は時間帯に依存しない振る舞いをします。あなたの答えに矛盾するつもりはありませんでした。 –

5

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

123456は、グリニッジ(UTC)の正午に対応しています。しかし、それはニューヨークでは異なる時期になるでしょう。

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

5

なぜですか?おそらくあなたが最も可能性の高い今見ることができる、それは私がこれを書いている私の時間だから、それは異なり -

「10月4日2009、午後02時20分」のようなものは、それが参照するタイムゾーンを知らなくても無意味であるため、同じ瞬間であっても、あなたの時間から数時間はかかります。

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

+1

私はこれが古いスレッドだと知っていますが、なぜタイムゾーンなしの日付が無意味なのかについてのあなたの説明/説明のために投票しなければなりませんでした。 –

+1

@HelterScelter私は同じことをdownvoteする必要があります。それは、質量が無意味で無意味であると言うのと同じです。彼らはどちらも意味のある意味を持っています。 –

2

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

関連する問題