2010-12-03 7 views

答えて

51

ワン:

Date date = new Date(System.currentTimeMillis() - (4 * 60 * 60 * 1000)); 

これが考慮にDST (Daylight Saving Time)を取ることはありません。代替方法はCalendarです:

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.HOUR_OF_DAY, -4); 
Date date = calendar.getTime(); 

これはかなり醜いAPIです。代替はJodaTimeです:

DateTime dateTime = new DateTime().minusHours(4); 
Date date = dateTime.toDate(); // If you ever need this... 
+1

なぜDSTを考慮に入れないのですか? –

+2

最初の方法では動作しますが、DST *タイムゾーン遷移*を考慮しないと言ってもいいと思います。 JodaTimeに言及すると+1します。 –

+4

@Thor:実行中に、System#currentTimeMillis()に基づいて、過去4時間にDSTが有効/無効にされているかどうかわからないため、結果として生じる時間がオフになる危険があります。 – BalusC

2

戻って日付に変換し、4時間でミリ秒数を引く、ミリ秒に変換します。

6
Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.HOUR_OF_DAY, -4); 
calendar.getTime(); 
+2

'Calendar.HOUR'は12時間(AM/PM)ベースであり、24時間ベースではありません。 'Calendar.HOUR_OF_DAY'が必要です。また、 'Calendar#getInstance()'ファクトリを使うことは、リージョン固有のカレンダを手動で構築するよりも優先されます。 – BalusC

+0

@BalusC:修正されました。 –

1
Calendar c =Calendar.getInstance() ; 
c.add(Calendar.HOUR,-4); 
Date d = c.getTime(); 
+0

この場合、ロールするにはaddが好ましい。 – Avrom

+0

ロール方式は、午前4時から23時59分までしか動作しません。それ以外の場合は、間違った日になります。 – Robert

2
Calendar c = Calendar.getInstance(); 
c.add(Calendar.HOUR_OF_DAY, -4); 
java.util.Date d = c.getTime(); 
System.out.println(d); 
3

を参照してくださいが正しいですが、私は、近代的な答えに貢献したいと思います。現代のソリューションは、近代的なJavaの日時APIであるjava.timeを使用しています。

Instant fourHoursAgo = Instant.now().minus(Duration.ofHours(4)); 
System.out.println(fourHoursAgo); 

これだけ印刷:

2018-01-31T15:22:21.113710Z 

最後にZは時間がUTCに印刷されていることを示している - あなたがする場合はUTCでゼロを相殺しました。 Instantクラスは、Dateの現代的な代替品なので、それに固執することをおすすめします。現代のAPIは、一般的に非常にきれいで、非常によく設計されています。

ライブラリクラスに4時間の減算をさせることの利点に注意してください。コードは読みやすく、エラーが起こりにくいものです。面白い定数がなく、読者が正しいかどうかを確認する時間がありません。

あなたはこのように変換し、変更することはできませんか、変更したくないレガシーAPIを使用しているときには、例えば、昔ながらのDateオブジェクトが必要です場合:

Date oldfashionedDate = Date.from(fourHoursAgo); 

リンク:Oracle Tutorial trail: Date Time。もちろん、インターネットには他のリソースもありますので、検索してください。

+0

次回は重複した回答を投稿するのではなく、dupeとしてクローズに投票してください。 – BalusC

+0

ポイント@BalusCを参照してください。私はそれらが正確な重複を考慮したならば(私の2つの回答の間に実質的な重複がありますが、それらは同じではありません)。 –

関連する問題