[解決済み] 2つの日付範囲が重なっているかどうかを判定する
質問
2つの日付範囲があるとき、その2つの日付範囲が重なっているかどうかを判断する最も簡単な方法、または最も効率的な方法は何ですか?
例として、DateTime変数で示される範囲があるとします。
StartDate1
から
EndDate1
そして
StartDate2
から
EndDate2
.
解決方法は?
(StartA <= EndB) と (EndA >= StartB) です。
証明する。
条件Aは、日付範囲Aが日付範囲Bより完全に後であることを意味するとする
_ |---- DateRange A ------|
|---Date Range B -----| _
(もし
StartA > EndB
)
条件Bは、日付範囲Aが日付範囲Bより完全に前にあることを意味するとする
|---- DateRange A -----| _
_ |---Date Range B ----|
(もし
EndA < StartB
)
AもBも真でない場合、Overlapが存在する - 。
(ある範囲が完全にどちらにも属さない場合。
または完全に前にある。
の場合、それらは重なり合う必要があります)。
これで ド・モルガンの法則 にはこう書いてある。
Not (A Or B)
<=>
Not A And Not B
と訳される。
(StartA <= EndB) and (EndA >= StartB)
注:端がぴったり重なる状態も含まれます。 それを除外したい場合。
変更する
>=
演算子を
>
であり、かつ
<=
から
<
注2.バオダッド(@Baodad)に感謝し、以下を参照してください。
このブログ
が、実際の重なりは一番少ないです。
{
endA-startA
,
endA - startB
,
endB-startA
,
endB - startB
}
(StartA <= EndB) and (EndA >= StartB)
(StartA <= EndB) and (StartB <= EndA)
注3. @tomosius のおかげで、短縮版が読めます。
DateRangesOverlap = max(start1, start2) < min(end1, end2)
これは、実際にはより長い実装のための構文上のショートカットであり、開始日が endDates の上または前にあることを確認するための特別なチェックが含まれています。 上記から派生したものです。
開始日と終了日が順番通りでない可能性がある場合、すなわち
startA > endA
または
startB > endB
の場合、それらが順番に並んでいることもチェックしなければならないので、2つの有効性ルールを追加することになります。
(StartA <= EndB) and (StartB <= EndA) and (StartA <= EndA) and (StartB <= EndB)
または
(StartA <= EndB) and (StartA <= EndA) and (StartB <= EndA) and (StartB <= EndB)
または
(StartA <= Min(EndA, EndB) and (StartB <= Min(EndA, EndB))
または
(Max(StartA, StartB) <= Min(EndA, EndB)
しかし、実装するためには
Min()
と
Max()
のように、(C言語の3進数を用いて)コーディングする必要があります。
(StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)
関連
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] JavaScriptで2つの日付を比較する
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] 2つの日付範囲が重なっているかどうかを判定する
-
[解決済み] 円周率の計算が正確かどうかを判断するにはどうしたらよいですか?
-
[解決済み] 2つの日付の間の日数を計算する方法
-
[解決済み] モーメント js 日付時刻比較
-
[解決済み】ISO 8601とRFC 3339の日付書式の違いは何ですか?
-
[解決済み】ある日付から曜日を求めるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 現在時刻をdatetimeで取得する方法
-
[解決済み] Crystal Reportsで現在の日付と時刻を表示するにはどうすればよいですか?
-
[解決済み] 2つの日付範囲が重なっているかどうかを判定する
-
[解決済み] 重複期間を検出するアルゴリズム【重複あり
-
[解決済み】ISO 8601とRFC 3339の日付書式の違いは何ですか?
-
[解決済み】datetime.dateとdatetime.timeのオブジェクトを組み合わせるPythonicな方法
-
[解決済み】postgresで間隔を時間数に変換するにはどうすればいいですか?
-
[解決済み】PowerShellでDateTimeをフォーマットする方法
-
[解決済み] moment.js で datetime を YYYY-MM-DD HH:mm:ss にフォーマットする
-
[解決済み] UTCとGMTの違いは何ですか?