• ベストアンサー

日付の重複

期間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 ⇒重複とみなす いろいろやってみましたが、上手くいかないのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • liwet
  • ベストアンサー率72% (18/25)
回答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の終了

yumi_
質問者

お礼

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

その他の回答 (2)

回答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つを||で結合すればいいと思いますが。

yumi_
質問者

お礼

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

  • liwet
  • ベストアンサー率72% (18/25)
回答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/java/util/Calendar.html
yumi_
質問者

補足

回答ありがとうございます。 書き方が悪かったと思いますが、分からないのはそこではありません。 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