日時の差を求めるには?
2つの日時の差を計算する、ということもよくありますね。Calendarには、2つのCalendarの差を計算するメソッドというのは特に用意されてはいません。これは、ちょっとばかり考え方を変えてやる必要があります。
2つの日時の差というのは、それぞれの日時の値を単純な数値で表現できれば、案外と簡単に求められます。Calendarでには、内部で「エポックからの UTC ミリ秒値」で日時を管理していましたね。これは、基準日時からどれだけの時間が経過したかを示す数値でした。ということは、それぞれの日時でこの経過時間の値を調べ、その差を計算すれば、2つの日時の差がどれだけのものか、ミリ秒の値で取り出せるわけです。
public static void main(String[] args) {
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR, 0);
cal1.set(Calendar.MINUTE, 0);
cal1.set(Calendar.SECOND, 0);
cal1.set(Calendar.MILLISECOND, 0);
Calendar cal2 = Calendar.getInstance();
cal2.set(2001,0,1,0,0,0);
long s1 = cal1.getTimeInMillis();
long s2 = cal2.getTimeInMillis();
int d =(int)((s1 - s2) / (1000 * 60 * 60 * 24));
System.out.println("差は、" + d + "日間");
}
プログラムを実行すると、2001年1月1日から今日まで何日あるか計算し表示する。 |
ここでは、今日の日付をcal1に、2001年1月1日をcal2にそれぞれ設定し、その差を計算しています。それぞれのCalendarインスタンスは、計算を単純にするため、時分秒をすべてゼロにしています。Calendarでは、年月日時分秒の個々の値を変更するのに「set」というメソッドを使います。これは、
[Calendar].set( 設定する単位 , 設定値 );
こんな形で使います。addと同じように、第1引数に変更する単位をCalendarのクラスフィールドから指定し、第2引数に設定する値を渡します。また、年月日時分秒をまとめて変更する場合には、setの引数にすべての単位の値をまとめて記述することもできます。
ここで注意しておきたいのは、MONTHの値です。MONTHは、ゼロから始まる数値で指定します。つまり「1月」は「0」に、「12月」は「11」になるのです。これはよく覚えておきましょう。