
全て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件)
- 最新から表示
- 回答順に表示
No.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クラスをごまかして時間の表現に使います)
No.3
- 回答日時:
日付の計算は、数値のようには簡単に出来ません。
60分、24時間などが現れます。
つまりintやlongだけで処理をしようとするとそのたびに複雑なプログラミングを組まなければなりません。
そこでjavaの場合、日付の計算として、
DATE型やCalendar型が用意されています。
日時を「ある基点となる時間からの経過したミリ秒」として扱えば、その日時の差は、経過ミリ秒としてあつかうことが出来ます。この場合普通long型として処理できますし多くの言語等でも採用されています。
DATE型は、主にこの考え方に基づいて作られていますが、あくまでクラスですから直接引き算は出来ません。メソッドをつかって、ミリ秒を取得する必要があります。
さて、Calendar型ですがこれも「ある基点となる時間からの経過したミリ秒」の情報を維持するクラスですが、時間差を維持するものではありません。
したがって、直接Calendar型の差を求めることは出来ません。時間差を求めるには、まずそのメソッドを使って経過したミリ秒を求めてからということになります。
その結果の時間差は、Calendar型ではあつかえませんので代入できません。
日付(calD)の何日後というのは求められますが、日付(calD)の日付(calC)後というのは出来ません。calCに時間差を保存していると勘違いしているからでしょう。
図式的に書くと
--------------------------------------------------
・ 日付+日付: ダメ
・ 日付-日付: 直接はダメでメソッドを使う
・ 日付の何日後: 直接はダメでメソッドaddを使う
・ 日付の何日前: 直接はダメでメソッドaddを使う
--------------------------------------------------
いづれにしても慣れるのにちょっと時間はかかるかと思いますが
Calendar型
に挑戦してください。
No.2
- 回答日時:
差をCalendarオブジェクトで得るためには、computeTime(), computeFields(), そして必要ならcomplete()メソッドを使います。
加算減算はadd()メソッドで十分です。
No.1
- 回答日時:
>calC ←calAとcalBの差を入れたい
日付の差は Calendar オブジェクトにはならないので、秒数などで計算するしかないでしょう。
>calDにはcalCに入っている値を加算したい。
calD に指定の秒数を足せばよいはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 表計算ソフトcalcにおいて、1時間10分を1.1と表記する方法とそれらを集計する方法は? 4 2022/04/06 16:54
- 電気工事士 6.6kVケーブル単芯325sq-1.5kmの遮蔽銅テープ抵抗値は何Ω? 1 2023/05/02 21:06
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Excel(エクセル) DATE関数で指定する「日」のセルが関数の場合の対処法 5 2022/09/14 15:46
- 化学 [例題①]プロパンのOHとの反応速度定数を k=1.0×10⁻¹²cm³s⁻¹、 [OH]=1.0× 0 2023/05/28 13:12
- 財務・会計・経理 1年度期首に購入した取得原価800,000、残存価額0、耐用年数5年の機械について、定額法と定率法( 3 2022/07/06 13:02
- Excel(エクセル) 時間差を求めるマクロコードを教えてください。 4 2022/05/17 18:22
- 数学 数学の問題について 1 2023/02/13 18:40
- 統計学 標準誤差の求め方 2 2022/07/04 19:59
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Class.forName("org.postgresql...
-
全パッケージの取得、全クラス...
-
WPF C# PointToClient
-
javaのクラスの分け方について...
-
エクセルVBAで、条件に一致する...
-
String.containsの反対機能はあ...
-
アコーディオンメニューをアン...
-
0歳児の指しゃぶりに関して
-
中学生です。 私は教室の黒板に...
-
変数名の付け方
-
そんなにお金がなくても年に1度...
-
今日は こどもの日 で、良い天...
-
クラス間でのデータ参照
-
VB.NETでフォーム上にExcelのよ...
-
packageとimport の違いって?
-
Excel VBA 定数にオブジェクト...
-
僕の出身中学校は200人同級生が...
-
エクセルVBAでのwitheventsにつ...
-
Spring などDIコンテナの利点と...
-
フォームオブジェクトの削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# 「データが失なわれる可能性...
-
「継承されたメソッドの可視性...
-
(vba)他のアプリケーションの右...
-
【C#】クラスのコンストラクタ...
-
VB DLLプロジェクトについて
-
メソッドの引数にクラス名を渡す
-
「ラッパークラス」の存在意義...
-
interface,extend,implementの...
-
c++でのヘッダーファイルの循環...
-
このエラーメッセージの意味を...
-
委譲って何ですか?
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
ファイルパスが取得出来ない(P...
-
ASP.NETでの共通コードの書き方...
-
Commons-Discovery.jarとは?
-
デバッグ時に「Source not found」
-
JTextFieldの入力制限
-
JavaのimplementsをC言語で例え...
-
オーバーライドとラッパーの違い
おすすめ情報