現在の時間を一度エポック秒に直し、エポック秒単位で演算して2つの時間の差を求める。
エポック秒は1970年1月1日からの総秒数を示したLong型の数値です。
java.util.DateはgetTime()でエポック秒を取得できます。
Date startDate = // ある時間
Date endDate = // ある時間
Long differTime = endDate.getTime() - startDate.getTime(); // msecgetTime()の値はミリ秒です。これは1秒の1000分の1です。
このように取得できるのはミリ秒までで、2つの日付の差を「分」で取得したり「日数」で取得することはできません。
ApacheCommonsライブラリを用いると、2つの時間の差を任意の形式で取得することができます。
Calendar cal = Calendar.getInstance();
Date startDate = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, 1);
Date endDate = cal.getTime();
String durText = DurationFormatUtils.formatPeriod(startDate.getTime(),endDate.getTime(),"d");
assertEquals(1,Integer.parseInt(durText));
durText = DurationFormatUtils.formatPeriod(startDate.getTime(),endDate.getTime(),"s");
assertEquals(86400,Integer.parseInt(durText));
CalendarクラスにはgetFirstDayOfWeek()というその週の初めの日付を取得するメソッドが用意されていますが、このメソッドで取得される週の初めというのは、日時ロケールによって変化してしまいます。
また好きな曜日を週の初めと設定することができません。
そこで、任意の曜日から一週間を取得するには下記のようなコードを使います。
Calendar today = Calendar.getInstance();
// todayから遡って最初の水曜日のDateを取得。
Date firstWnd = null;
Calendar chkCal = Calendar.getInstance();
chkCal.setTime(today.getTime());
while(1==1){
chkCal.add(Calendar.DAY_OF_MONTH, -1);
if( chkCal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY ) {
firstWnd = chkCal.getTime();
break;
}
}
// 下記は、過去3週間分の日付を出力するサンプル
Calendar calcCal = Calendar.getInstance();
calcCal.setTime(firstWnd);
for(int i=0;i<3;i++) {
Date weekEnd = calcCal.getTime();
calcCal.add(Calendar.DAY_OF_MONTH, -7);
Date weekStart = calcCal.getTime();
SimpleDateFormat smd = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
System.out.println(String.format("%1$s カラ %2$s", smd.format(weekStart), smd.format(weekEnd) ) );
}
上記の例では「水曜日」を週の区切りとしています。
このコードは無駄も多く、本来ならばもっと簡単に現在の日付の曜日から最初の水曜日の取得を行うこともできますが、
コードの見通しという意味を重視するならば上記のコードの方が、おそらく誰の目からみても水曜日に着目することが出来るでしょう。
また、「火曜日」から始まる一週間を計算したいという要望にたいしても、ロジックを深く考える必要もなく「Calendar.WEDNESDAY」を「Calendar.TUESDAY」にすればとりあえず動作すると直感できます。