Jasper Reportsで作成されたレポートがあり、java.util.Dateのみを認識します(カレンダーやグレゴリオ暦などは認識しません)。
現在の日付の7日前に日付を作成する方法はありますか?
理想的には、次のようになります。
new Date(New Date() - 7)
更新:これを十分に強調することはできません:JasperReportsはJavaカレンダーオブジェクトを認識しません。
Jasper Reportsで作成されたレポートがあり、java.util.Dateのみを認識します(カレンダーやグレゴリオ暦などは認識しません)。
現在の日付の7日前に日付を作成する方法はありますか?
理想的には、次のようになります。
new Date(New Date() - 7)
更新:これを十分に強調することはできません:JasperReportsはJavaカレンダーオブジェクトを認識しません。
まさに今から:
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 earlier
12pm on 7 Mar 2010
このソリューションでは、正確に 24 時間 * 7 日 = 168 時間前の日付/時刻が検出されます。
ただし、このソリューションが、たとえば、タイムゾーンのウォールクロック時間が2 つの日付/時間 ( vs ) で同じではないという結果を返す可能性があることを発見すると、驚く人もいます。これは、夏時間がその夜に開始または終了し、「壁時計時間」が 1 時間を増減するためです。(14 Mar 2010 1:00pm) - 7 * DAY_IN_MS
(7 Mar 2010 12:00pm)
1pm
12pm
(168 hours)
DST が問題にならない場合、または(実時間のずれに関係なく) 正確に実行したい場合、この解決策は問題なく機能します。
それ以外の場合は、7 days earlier
正確に 168 時間を意味しない場合 (その時間枠内で DST が開始または終了するため) を補正する必要がある場合があります。
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();
試す
Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000));
もう 1 つの方法は、Calendar を使用することですが、自分で使用するのは好きではありません。
これを試して:
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
return c.getTime();
「日」を決定するには、タイムゾーンが必要です。タイム ゾーンは、「1 日」がいつ始まるかを定義します。タイム ゾーンには、夏時間やその他の異常を処理するためのルールが含まれています。タイムゾーンを無関係にする魔法はありません。この問題を無視すると、JVM のデフォルトのタイム ゾーンが適用されます。これは、混乱と痛みにつながる傾向があります。
java.util.Date および .Calendar クラスは厄介なことで有名です。それらを避けてください。それらは非常に悪いため、Sun/Oracle はそれらを Java 8 の新しいjava.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();
上記のように、java.util.Date から Joda-Time に変換するには、Date オブジェクトを DateTime のコンストラクターに渡すだけです。juDateには time zone がなく、DateTime にはあることを理解してください。したがって、「日」とは何か、いつ開始するかを決定するために、希望する/適切なタイムゾーンを割り当てます。
逆に DateTime から juDate にするには、toDate
メソッドを呼び出すだけです。
java.util.Date date = dateTime.toDate();
激しい議論のために:
タイムゾーンが指定されていないと、質問に適切な回答がない場合があります。
以下は、デフォルトのタイムゾーンの夏時間を考慮したデフォルトの(したがって非推奨の)タイムゾーンで動作するコードです。
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
答えに投票しないでください。
私はこのようにしています:
Date oneWeekAgo = DateUtils.addDays(DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH), -7);