日時の値とカレンダー (4/6)
作成:2012-07-22 19:41
更新:2012-07-22 19:41
更新:2012-07-22 19:41
■2つの日時の差の計算
これは、実はちょっと面倒くさいのです。2つの日付の差を計算するもっともシンプルな方法は、それぞれを1つの数字に変換して引き算することです。
CalendarやDateなどの時間に関するオブジェクトは、日時を「ある決まった時刻からどれだけ経過したか」によって表現できるようになっています。これは「エポック(Epoch)」と呼ばれるもので、世界標準時の1970年1月1日午前零時からどれだけ経過したかを、ミリ秒数単位の整数(long値)に換算して表したものです。
これで単純に「何日あるか」は計算できます。が、長い期間の場合は、やっぱり「○○年と○○ヶ月と○○日」というような具合に結果を表示したいですね。この場合はどうするのでしょう?
もちろん、1つ1つの単位当たりのミリ秒数を計算して値を調べるというやり方はありますが、Calendarを使えばもっと簡単に結果を得ることができます。Calendarは、エポック値を使って日時を設定することもできるのです。
下に実際の例を挙げておきましょう。これは2001年の元旦から今日までどれだけの期間があるかを計算し表示するものです。「○○年○○ヶ月と○○日あります」というように、年月日による形で期間を表示しています。
CalendarやDateなどの時間に関するオブジェクトは、日時を「ある決まった時刻からどれだけ経過したか」によって表現できるようになっています。これは「エポック(Epoch)」と呼ばれるもので、世界標準時の1970年1月1日午前零時からどれだけ経過したかを、ミリ秒数単位の整数(long値)に換算して表したものです。
long 変数 = 《Calendar》.getTimeInMillis();これで、そのCalendarインスタンスの日時をエポックによるlong値として取り出すことができます。2つの日時からそれぞれこの値を取り出し、その差を計算すれば、2つの日時の間がどれだけあるかをミリ秒で換算した値が得られます。ということは、「何日あるか」を計算したければ、この値を1日のミリ秒数(1000×60×60×24)で割ればいいわけですね。
これで単純に「何日あるか」は計算できます。が、長い期間の場合は、やっぱり「○○年と○○ヶ月と○○日」というような具合に結果を表示したいですね。この場合はどうするのでしょう?
もちろん、1つ1つの単位当たりのミリ秒数を計算して値を調べるというやり方はありますが、Calendarを使えばもっと簡単に結果を得ることができます。Calendarは、エポック値を使って日時を設定することもできるのです。
《Calendar》.setTimeInMillis( long値 );2つの日時の差を計算し、その結果を引数にしてsetTimeInMillisすれば、指定のミリ秒数が経過した時点でのCalendarインスタンスに設定できます。ここからgetで年月日の値を取り出していけばいいのです。ただし、エポック値は1970年1月1日がゼロになっていますから、取り出した年の値から1970を引く必要があります。
下に実際の例を挙げておきましょう。これは2001年の元旦から今日までどれだけの期間があるかを計算し表示するものです。「○○年○○ヶ月と○○日あります」というように、年月日による形で期間を表示しています。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
public static void main(String[] args) { Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal2.set(2001,0,1); long n = cal1.getTimeInMillis() - cal2.getTimeInMillis(); Calendar cal3 = Calendar.getInstance(); cal3.setTimeInMillis(n); int y = cal3.get(Calendar.YEAR) - 1970; int m = cal3.get(Calendar.MONTH) + 1; int d = cal3.get(Calendar.DATE); System.out.println(y + "年" + m + "ヶ月と" + d + "日あります。"); }
※関連コンテンツ