JDK > 日付時刻

時間の演算

時間の差を求める

現在の時間を一度エポック秒に直し、エポック秒単位で演算して2つの時間の差を求める。
エポック秒は1970年1月1日からの総秒数を示したLong型の数値です。

java.util.DateはgetTime()でエポック秒を取得できます。

Date startDate = // ある時間
Date endDate   = // ある時間
 
Long differTime = endDate.getTime() - startDate.getTime(); // msec

getTime()の値はミリ秒です。これは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」にすればとりあえず動作すると直感できます。

最終更新:2011年01月25日 20:04
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。