概要
6:00-7:00のような時間が複数与えられたときに時間が重なるかチェックしたい。重なる場合は2つの時間をまとめて一つの時間としたい。
以下のようなイメージ
例1
|--------------|
|-----------------|
5:30 6:00 6:30 7:00
重なっていると判定して、"5:30-7:00"を得たい
例2
|----------|
|----------|
5:30 6:00 6:30 7:00
重なっていないと判定
コード
まず重なっているかどうかを判断して、重なっていた場合は最早時間-最遅時間を導けば良い。
そのため以下の2つのモジュールで解決する。
* 時間が重なっているかどうかを判定
* 最も早い/最も遅い時刻を取り出す
pythonのdatetimeでは、datetime/date/timeの型さえ同じであれば、><=比較演算子が使えるので比較的容易にかけた。
※追記:min()/max()も使えるようなので書き直しました。凄いぜpython....
import datetime
def is_overlap_time(starttime1, endtime1, starttime2, endtime2):
return starttime1 <= endtime2 and endtime1 >= starttime2
def get_earliest_time(*times):
return min(times)
def get_latest_time(*times):
return max(times)
# usage
six_oclock = datetime.time(6, 0, 0)
five_thirty = datetime.time(5, 30, 0)
six_thirty = datetime.time(6, 30, 0)
seven_oclock = datetime.time(7, 0, 0)
print(is_overlap_time(six_oclock, seven_oclock, five_thirty, six_thirty))
print(is_overlap_time(five_thirty, six_oclock, six_thirty, seven_oclock))
print(get_earliest_time(six_oclock, five_thirty, six_thirty, seven_oclock))
print(get_latest_time(six_oclock, five_thirty, six_thirty, seven_oclock))
# output
# -> True
# -> False
# -> 05:30:00
# -> 07:00:00
おまけ
時刻の集合から特定の条件で取り除きたい場合はリスト内包表記のフィルタ機能を利用し、比較演算子が使える。
例えば…
eject_before6 = [t for t in times if t >= datetime.time(6, 0, 0)]