2011-01-28 14 views
4

なぜこのコードが間違っているのか説明できますか?Java CalendarはUTCで前日の午前12時に設定します

// main 
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
System.out.println(calendar.getTime()); 
calendar.add(Calendar.DATE, -1); 
System.out.println(calendar.getTime()); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
System.out.println(calendar.getTime()); 

それは生産:

Fri Jan 28 15:27:35 EST 2011 
Thu Jan 27 15:27:35 EST 2011 
Wed Jan 26 19:27:35 EST 2011 

私は明らかに何かが足りないのですか? Thu Jan 27 00:27:35 EST 2011

ありがとうございました。

+0

00:27:35の時間は、午前12時と同じですか?私は12時を00:00:00と期待します。 –

答えて

3

UTCではなく、デフォルトのタイムゾーンで印刷しています。あなたのカレンダーは、あなたが興味を持っているタイムゾーンを知っていますが、getTime()によって返されたjava.util.Dateはありません...そしてDate.toString()はシステムタイムゾーンを使用します。

で指定したを指定すると、UTCで午前12時にしたいと思ったのですが、なぜThu Jan 27 00:27:35 EST 2011ですか? ESTはUTCと同じではありません。

EDIT:いつものように、私はちょうどJoda Timeは、一般的に、Javaの日付/時刻の算術演算に使用するくらいよりよいAPIであることを指摘したいと思います。あなたは現在正しい答えを得ていますが、私はまだジョーダに移動することをお勧めします:)

+0

良い点。実際には数学は正確で、出力は間違っていますか? – Anon

+0

ちょうどそれを試した...ありがとう – Anon

2

ESTはUTC - 5時間ですので、19:27 ESTは00:27 UTCに対応します。それは私には論理的なようです。 デフォルトロケールを使用する代わりに、UTCロケールで日付形式を使用してカレンダーを表示します。

0

UTCの計算(のみ)では、longを使用する方が簡単です。

long time = System.currentTimeMillis(); 
// yesterday at 12:00:00.000 am. 
long yesterday = (time/86400000 - 1) * 86400000; 
関連する問題