32

Jasper Reportsで作成されたレポートがあり、java.util.Dateのみを認識します(カレンダーやグレゴリオ暦などは認識しません)。

現在の日付の7日前に日付を作成する方法はありますか?

理想的には、次のようになります。

new Date(New Date() - 7)

更新:これを十分に強調することはできません:JasperReportsはJavaカレンダーオブジェクトを認識しません。

4

11 に答える 11

59

まさに今から:

long DAY_IN_MS = 1000 * 60 * 60 * 24;
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS))

任意からDate date:

new Date(date.getTime() - (7 * DAY_IN_MS))

編集:他の回答で指摘されているように、それが要因である場合、夏時間は考慮されていません。

私が話していたその制限を明確にするために:

サマータイムの影響を受ける人々にとって、もし が であれば、7 days earlier現在が であれば結果を にし12pm noon on 14 Mar 2010たいということあり、注意が必要です。 7 days earlier12pm on 7 Mar 2010

このソリューションでは、正確に 24 時間 * 7 日 = 168 時間前の日付/時刻が検出されます。

ただし、このソリューションが、たとえば、タイムゾーンのウォールクロック時間が2 つの日付/時間 ( vs ) で同じではないという結果を返す可能性があることを発見すると、驚く人もいます。これは、夏時間がその夜に開始または終了し、「壁時計時間」が 1 時間を増減するためです。(14 Mar 2010 1:00pm) - 7 * DAY_IN_MS (7 Mar 2010 12:00pm)1pm12pm

(168 hours)DST が問題にならない場合、または(実時間のずれに関係なく) 正確に実行したい場合、この解決策は問題なく機能します。

それ以外の場合は、7 days earlier正確に 168 時間を意味しない場合 (その時間枠内で DST が開始または終了するため) を補正する必要がある場合があります。

于 2011-02-04T20:41:42.113 に答える
32

Calendar の機能を使用して、次を使用して新しい Date オブジェクトを作成しますgetTime()

import java.util.GregorianCalendar;
import java.util.Date;

Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_MONTH, -7);
Date sevenDaysAgo = cal.getTime();
于 2011-02-04T20:38:18.683 に答える
13

試す

 Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000));

もう 1 つの方法は、Calendar を使用することですが、自分で使用するのは好きではありません。

于 2011-02-04T20:38:25.440 に答える
5

これを試して:

Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
return c.getTime();
于 2011-02-04T20:40:30.140 に答える
4

「日」を決定するには、タイムゾーンが必要です。タイム ゾーンは、「1 日」がいつ始まるかを定義します。タイム ゾーンには、夏時間やその他の異常を処理するためのルールが含まれています。タイムゾーンを無関係にする魔法はありません。この問題を無視すると、JVM のデフォルトのタイム ゾーンが適用されます。これは、混乱と痛みにつながる傾向があります。

java.util.Date を避ける

java.util.Date および .Calendar クラスは厄介なことで有名です。それらを避けてください。それらは非常に悪いため、Sun/Oracle はそれらを Java 8 の新しいjava.time パッケージに置き換えることに同意しました。それまたはJoda -Time のいずれかを使用してください。

Joda-Time

Joda-Time 2.3 のコード例。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Specify or else the JVM's default will apply.
DateTime dateTime = new DateTime( new java.util.Date(), timeZone ); // Simulate passing a Date.
DateTime weekAgo = dateTime.minusDays( 7 );

一日の最初の瞬間

または、時刻を 1 日の最初の瞬間に調整して、1 日分の時間をキャプチャすることもできます。メソッドを呼び出しwithTimeAtStartOfDayます。これは常にではありませんが、通常はそうであることに注意してください00:00:00

Joda-Time の「真夜中」のメソッドとクラスは避けてください。それらは不完全な概念に基づいており、現在は推奨されていません。

DateTime dateTimeStart = new DateTime( new java.util.Date(), timeZone ).withTimeAtStartOfDay(); // Not necessarily the time "00:00:00".
DateTime weekAgo = dateTime.minusDays( 7 ).withTimeAtStartOfDay(); 

juDate から/への変換

上記のように、java.util.Date から Joda-Time に変換するには、Date オブジェクトを DateTime のコンストラクターに渡すだけです。juDateには time zone がなく、DateTime にはあることを理解してください。したがって、「日」とは何か、いつ開始するかを決定するために、希望する/適切なタイムゾーンを割り当てます。

逆に DateTime から juDate にするには、toDateメソッドを呼び出すだけです。

java.util.Date date = dateTime.toDate();
于 2014-06-21T01:56:31.527 に答える
0

激しい議論のために:

タイムゾーンが指定されていないと、質問に適切な回答がない場合があります。

以下は、デフォルトのタイムゾーンの夏時間を考慮したデフォルトの(したがって非推奨の)タイムゾーンで動作するコードです。

Date date= new Date();
date.setDate(date.getDate()-7);//date works as calendar w/ negatives

解決策は機能しますが、タイムゾーンを想定するという点ではまったく偽物です。

new Date(System.currentTimeMillis() - 10080*60000);//a week has 10080 minutes

答えに投票しないでください。

于 2011-02-04T22:13:43.743 に答える
0

私はこのようにしています:

Date oneWeekAgo = DateUtils.addDays(DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH), -7);
于 2017-10-06T14:28:00.203 に答える