- ベストアンサー
日付の重複
期間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 ⇒重複とみなす いろいろやってみましたが、上手くいかないのです。
- みんなの回答 (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の終了
その他の回答 (2)
- freedom560
- ベストアンサー率46% (80/173)
「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つを||で結合すればいいと思いますが。
お礼
ありがとうございました。
- liwet
- ベストアンサー率72% (18/25)
Dateではなく、Calendarを使うと良いです。 afterとbeforeで比較ができます。 期間Aの終わり.after(期間Bの始まり) && 期間Aの始まり.before(期間Bの終わり) なら重複している、という感じで調査できると思います。
補足
回答ありがとうございます。 書き方が悪かったと思いますが、分からないのはそこではありません。 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メソッド等に置き換えるとして) どうかよろしくお願いします。
お礼
ありがとうございました。 あれからいろいろと考え、重複するものを求めるのではなく、逆に重複しないものを求めてtrue、falseを返せばいいのではと思い、 期間A、期間Bのうち、まず、「開始」が遅い方を求め、期間Bの方が「開始」が遅かった場合、Bの「開始」 > Aの「終了」であれば重複しない⇒この条件にヒットしなければ重複するということ、という風にしていました。 これでも条件判定がif、else ifと2つ必要でした。 でも、教えていただいた方法を使えば1つで済むんですね。 勉強になりました。ありがとうございました。