![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
期間A 2006/04/05 ~ 2006/07/31
期間B 2006/05/05 ~ 2006/08/30
AとBの期間が1日でも重複しているかどうかを調べるにはどうしたらいいでしょうか?
JavaのDateクラスのメソッドを使用する予定ですが、比較演算子(<,<=,>,>=)等の例でも構いませんので、ご教授ください。
期間A 2006/04/05 ~ 2006/07/31
期間B 2006/03/05 ~ 2006/08/30
⇒重複とみなす
期間A 2006/04/05 ~ 2006/07/31
期間B 2006/05/05 ~ 2006/06/05
⇒重複とみなす
期間A 2006/04/05 ~ 2006/07/31
期間B 2006/03/05 ~ 2006/04/05
⇒重複とみなす
期間A 2006/04/05 ~ 2006/07/31
期間B 2006/07/31 ~ 2006/08/30
⇒重複とみなす
いろいろやってみましたが、上手くいかないのです。
No.3ベストアンサー
- 回答日時:
比較時の条件だけということですね。
Aの開始 ≦ Bの終了 && Bの開始 ≦ Aの終了
だけで全てのパターンを検出できます。
以下のパターンが重複するものですが、全て上の条件式で検出できます。
Aの開始-----------------Aの終了
Bの開始------------------Bの終了
Aの開始------------------Aの終了
Bの開始-----------------Bの終了
Aの開始----------------------------Aの終了
Bの開始-------Bの終了
Aの開始-------Aの終了
Bの開始----------------------------Bの終了
重複しない以下のパターンでは、上の条件式は成立しません。
Aの開始-------Aの終了
Bの開始-------Bの終了
Aの開始-------Aの終了
Bの開始-------Bの終了
ありがとうございました。
あれからいろいろと考え、重複するものを求めるのではなく、逆に重複しないものを求めてtrue、falseを返せばいいのではと思い、
期間A、期間Bのうち、まず、「開始」が遅い方を求め、期間Bの方が「開始」が遅かった場合、Bの「開始」 > Aの「終了」であれば重複しない⇒この条件にヒットしなければ重複するということ、という風にしていました。
これでも条件判定がif、else ifと2つ必要でした。
でも、教えていただいた方法を使えば1つで済むんですね。
勉強になりました。ありがとうございました。
No.2
- 回答日時:
「1日でも」だったらこう考えればいいんじゃないですか?
A.start-------A.end
を基準に考えて
1. B.startがこの間にあるとき つまり
A.start-------A.end
B.start
A.start<=B.start && B.start<=A.end
B.endはA.endより前にあろうが後ろにあろうが重複期間はあります
2. 同様にB.endがこの間にあるとき
A.start<=B.end && B.end<=A.end
3. A.endとB.endが両方ともこの区間にないとき
このときはB.startがA.startよりも先でB.endがA.endより後なら重複期間があります。つまり
A.start-------A.end
B.start----------------B.end
B.start<=A.start && A.end <=B.end
この3つを||で結合すればいいと思いますが。
No.1
- 回答日時:
Dateではなく、Calendarを使うと良いです。
afterとbeforeで比較ができます。
期間Aの終わり.after(期間Bの始まり) && 期間Aの始まり.before(期間Bの終わり)
なら重複している、という感じで調査できると思います。
参考URL:http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …
この回答への補足
回答ありがとうございます。
書き方が悪かったと思いますが、分からないのはそこではありません。
CalendarクラスとDateクラスにafter、before、equalsメソッドがあるのは知っています。
分からないのは、
A.start >= B.start && A.end < B.end
||
A.start < B.start && A.end > B.end
||
A.start > B.start &&(A.end >= B.end && A.start <= B.end)
||
A.start <= B.start && (A.end < B.end && B.start <= A.end)
||
A.start == B.start && A.start == B.start
これで、すべての重複を網羅しているのかどうかです。
すべての重複パターンにヒットするのかどうかです。
(比較演算子とあとでafter、beforeメソッド等に置き換えるとして)
どうかよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 Windows10 ファイル名と期間でファイルを検索するにはどうすればいいか 3 2023/06/07 14:01
- 労働相談 フレックスタイム制(清算期間1ヶ月)の場合、1日あたりの残業時間の上限はないという認識でOKですか? 4 2023/02/26 16:51
- 楽天市場 楽天ポイント5重取り 簡単に説明してください なんだか複雑そうですし そこのお店を調べておかなければ 1 2023/02/10 19:37
- 大学院 大学留年の危機 重複履修について 4 2022/09/14 23:10
- 生物学 【 生基 DNAの複製 】 問題 窒素の同位体15N(窒素14Nより重い)のみを窒素源として含む培地 2 2022/10/08 16:33
- 風邪・熱 コロナについて 6 2023/07/30 19:34
- Excel(エクセル) 名前と日付が一致する箇所にフラグを立てる関数が知りたいです 4 2022/08/11 02:24
- IT・エンジニアリング ドメイン駆動設計の値オブジェクトについて質問 1 2023/05/13 02:50
- 簿記検定・漢字検定・秘書検定 簿記2級 表作成時の仕訳の問題 2 2022/07/07 18:15
- 国民年金・基礎年金 障害年金(精神)の更新について質問があります。 文章で上手く伝えられるか不安ですが、経験者又は知識が 3 2023/03/17 21:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タイムアウトする仕組みを作りたい
-
レコードセットにnullの場合
-
subsequentとnextの違いってな...
-
「for next」文と「if then els...
-
リスト間のアイテム移動について
-
vbsのmsgboxランダム表示について
-
パスカル言語
-
他のフォームから別のフォーム...
-
VBA public変数はどのようなこ...
-
VB
-
エクセルVBAでテキストボッ...
-
VBAのフォーム カーソル移動
-
定数を構造体で・・・
-
VBによる回帰直線のプログラム
-
演奏記号の・・・・
-
プロシージャまたは関数の引数...
-
Picture box の サイズを変更
-
テキストボックスに入る文字を...
-
文字の判断
-
ExcelのVBAで文章にある複数の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
タイムアウトする仕組みを作りたい
-
レコードセットにnullの場合
-
subsequentとnextの違いってな...
-
日付の重複
-
verilogのcase文
-
Verilog-HDLによる設計において
-
Verilogの文法
-
リスト間のアイテム移動について
-
Rubyプログラミングの課題につ...
-
EXCEL VBA 文字 アドレス 検...
-
Delphiでコンポーネント名を変...
-
delphi
-
TreeViewのTag情報取得
-
pascalでの二分探索(バイナリ...
-
エクセルVBAついて ①if•••••the...
-
「for next」文と「if then els...
-
整順リスト形式の英単語辞書(pa...
-
直線検出のハフ変換プログラム(...
-
Matlab
-
【FPGA】VHDLのprocessとevent
おすすめ情報