dポイントプレゼントキャンペーン実施中!

期間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
⇒重複とみなす

いろいろやってみましたが、上手くいかないのです。

A 回答 (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の終了
    • good
    • 1
この回答へのお礼

ありがとうございました。
あれからいろいろと考え、重複するものを求めるのではなく、逆に重複しないものを求めてtrue、falseを返せばいいのではと思い、
期間A、期間Bのうち、まず、「開始」が遅い方を求め、期間Bの方が「開始」が遅かった場合、Bの「開始」 > Aの「終了」であれば重複しない⇒この条件にヒットしなければ重複するということ、という風にしていました。
これでも条件判定がif、else ifと2つ必要でした。
でも、教えていただいた方法を使えば1つで済むんですね。
勉強になりました。ありがとうございました。

お礼日時:2006/07/15 02:05

「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つを||で結合すればいいと思いますが。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2006/07/15 01:57

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メソッド等に置き換えるとして)
どうかよろしくお願いします。

補足日時:2006/07/13 23:33
    • good
    • 0

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


このQ&Aを見た人がよく見るQ&A