プロが教えるわが家の防犯対策術!

全てCalendar型です。
calA.set(2008, 1, 02, 07, 12, 0);
calB.set(2008, 1, 03, 0, 0, 0);
calC ←calAとcalBの差を入れたい
calD.set(2008, 1, 05, 0, 0, 0);

calAの2008年2月2日の7時12分から
calBの2008年2月3日の0時までの差(16時間48分)の求めて
calCに求めた値を入れたい。
calDにはcalCに入っている値を加算したい。

まずはcalBとcalAをgetTimeInMillisで計算するのかな?と思って
やってみたのですが結果は、Fri Jan 02 01:48:00 JST 1970となりました。
(getTimeも試してみましたが、こちらはエラーとなりました。)

Calendar型を使用して日付の加算や減算方法を教えていただけないでしょうか?

A 回答 (4件)

java言語に限らず、私の知る限り全てのプログラミング言語、


アプリケーションが、時刻の概念と時間の概念を区別していないために
難しくなっているのだと思います。

どういうことかというと、日常的に

 (時間)-(時間)=(時間)
 (時間)+(時間)=(時間)
 (時間)×(定数)=(時間)
 (時間)÷(定数)=(時間)
 (時間)×(時間)=無意味
 (時間)÷(時間)=(定数)

 (時刻)-(時刻)=(時間)
 (時刻)+(時刻)=無意味
 (時刻)-(時間)=(時刻)
 (時刻)+(時間)=(時刻)
 (時刻)×(定数)=無意味
 (時刻)÷(定数)=無意味
 (時刻)×(時間)=無意味
 (時刻)÷(時間)=無意味
 (時刻)×(時刻)=無意味
 (時刻)÷(時刻)=無意味

であることが、分かると思います。
しかしながら、java言語を含むプログラミング言語では、

 (時刻)-(時刻)=(時刻)

となってしまっています。
より具体的にjavaの例で言えば、

 (Calendarクラス)-(Calendarクラス)=(TimePeriodクラス)

でなければならないわけですが、

 (Calendarクラス)-(Calendarクラス)=(Calendarクラス)

となっています。また、javaにはTimePeriodクラスはありません。
日常的な例を挙げれば、

 (1)時給850円で、8時間20分働いたときの給与額はいくらですか?
 (2)一ヶ月の勤務規定時間が160時間のとき、一日7時間40分,20日間
   働いたときの不足分は何時間何分ですか?

というような計算を、Calendarクラスで実装するのは間違った方法であると
言うことです。Calendarクラスはあくまでも時刻を表していますので
(1)の計算のように時刻を定数倍すると変な値になってしまいますし、
負の時刻の概念はないので、上記の(2)の例のようなマイナスの時間を
表現したりすることは出来ない訳です。

これは、エクセル等の表計算アプリケーションでも同じ問題に出くわします。


javaの場合には、時間を表すTimePeriodクラスがどこかにありそうにも思うのですが、
残念ながら私はそれを実装した例を見たことがありません。
私の想像では、欧米人は時刻と時間の概念の区別があいまいなのかなと思っています。

というわけで、独自にTimePeriodクラスを実装する必要がありそうなのですが、
初心者の方にとっては非常に難しい問題ですので、とりあえず、この問題点を
理解したうえで、とりあえずはlong型の整数の時間を使って計算する方法をお勧めします。
入出力部を除いては、時間をプリミティブな定数として処理するという方法です。
(入出力部では、Calendarクラスをごまかして時間の表現に使います)
    • good
    • 2

日付の計算は、数値のようには簡単に出来ません。


60分、24時間などが現れます。
つまりintやlongだけで処理をしようとするとそのたびに複雑なプログラミングを組まなければなりません。

そこでjavaの場合、日付の計算として、
   DATE型やCalendar型が用意されています。

日時を「ある基点となる時間からの経過したミリ秒」として扱えば、その日時の差は、経過ミリ秒としてあつかうことが出来ます。この場合普通long型として処理できますし多くの言語等でも採用されています。

DATE型は、主にこの考え方に基づいて作られていますが、あくまでクラスですから直接引き算は出来ません。メソッドをつかって、ミリ秒を取得する必要があります。

さて、Calendar型ですがこれも「ある基点となる時間からの経過したミリ秒」の情報を維持するクラスですが、時間差を維持するものではありません。

したがって、直接Calendar型の差を求めることは出来ません。時間差を求めるには、まずそのメソッドを使って経過したミリ秒を求めてからということになります。

その結果の時間差は、Calendar型ではあつかえませんので代入できません。

日付(calD)の何日後というのは求められますが、日付(calD)の日付(calC)後というのは出来ません。calCに時間差を保存していると勘違いしているからでしょう。

図式的に書くと
--------------------------------------------------
・ 日付+日付:   ダメ
・ 日付-日付:   直接はダメでメソッドを使う

・ 日付の何日後: 直接はダメでメソッドaddを使う
・ 日付の何日前: 直接はダメでメソッドaddを使う
--------------------------------------------------

いづれにしても慣れるのにちょっと時間はかかるかと思いますが
Calendar型
に挑戦してください。
    • good
    • 0

差をCalendarオブジェクトで得るためには、computeTime(), computeFields(), そして必要ならcomplete()メソッドを使います。



加算減算はadd()メソッドで十分です。
    • good
    • 0

>calC ←calAとcalBの差を入れたい


日付の差は Calendar オブジェクトにはならないので、秒数などで計算するしかないでしょう。

>calDにはcalCに入っている値を加算したい。
calD に指定の秒数を足せばよいはずです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!