[C#] 判斷某個時段有沒有壓到另一個時段
關於時間問題,這我在專案中寫過多次每次寫都要重新考慮一次
這次就索性整理一下,然後就是直接複製貼上,懶得重寫
簡單的說因為常常寫訂單系統,就是有像是家教那樣他假設 12:00~13:00 有課,所以他的客戶不選擇這時段
這時候程式怎麼判斷時段有沒有壓到
先來張示意圖
基本上時間壓到會分成四種狀況 完全涵蓋(藍色),全部在裡面(紅色),壓到開始時間(綠色),壓到結尾時間(咖啡色)
接下來就是我的判斷程式:
測試部分:
結果:
基準時間 12:00~13:00
完全涵蓋 11:00~13:01:True
全部在裡面 12:20 ~12:21:True
壓到開始時間 11:20 ~12:20:True
壓到結尾時間 12:20 ~14:20:True
完全沒壓到1 11:20~11:59:False
完全沒壓到2 13:20~14:59:False
單點判斷開頭 12:00:True
單點判斷結尾 13:00:True
判斷一樣 12:00~13:00:True
判斷剛好壓到頭 11:00~12:00:True
判斷剛好壓到尾 13:00~14:00:True
但是注意有幾件事情要說 判斷剛好壓到頭,這一點在實務上是不合理的
假設有一個客人預約 11:00~12:00 但是你 12:00~13:00 剛好有空,11:00~12:00 應該要為 False 阿
這邊我提供兩個解決方案
1. 將baseStart 跟 baseEnd 加上一秒甚至一毫秒
2. 改寫程式碼中
壓到開始時間 改成
if (testStart <= baseStart && testEnd > baseStart) return true;
壓到結束時間 改成
if (testStart < baseEnd && testEnd >= baseEnd) return true;
這樣結果會變成
基準時間 12:00~13:00
完全涵蓋 11:00~13:01:True
全部在裡面 12:20 ~12:21:True
壓到開始時間 11:20 ~12:20:True
壓到結尾時間 12:20 ~14:20:True
完全沒壓到1 11:20~11:59:False
完全沒壓到2 13:20~14:59:False
單點判斷開頭 12:00:True
單點判斷結尾 13:00:True
判斷一樣 12:00~13:00:True
判斷剛好壓到頭 11:00~12:00:False
判斷剛好壓到尾 13:00~14:00:False
大概寫到這,其實有一個專門的 library ,只是殺雞焉用核子彈我就沒有細讀了,這邊附上連結
https://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET