import datetime
from typing import List, Tuple, Union
import dateutil.parser
from mapchete_eo.types import DateTimeLike
_time = {"min": datetime.datetime.min.time(), "max": datetime.datetime.max.time()}
[docs]
def to_datetime(t: DateTimeLike, append_time="min") -> datetime.datetime:
"""
Convert input into datetime object.
"""
if isinstance(t, datetime.datetime):
return t
elif isinstance(t, datetime.date):
return datetime.datetime.combine(t, _time[append_time])
else:
return dateutil.parser.parse(t)
[docs]
def time_ranges_intersect(
t1: Tuple[DateTimeLike, DateTimeLike],
t2: Tuple[DateTimeLike, DateTimeLike],
) -> bool:
"""
Check if two time ranges intersect.
"""
t1_start = to_datetime(t1[0], "min").replace(tzinfo=None)
t1_end = to_datetime(t1[1], "max").replace(tzinfo=None)
t2_start = to_datetime(t2[0], "min").replace(tzinfo=None)
t2_end = to_datetime(t2[1], "max").replace(tzinfo=None)
return (t1_start <= t2_start <= t1_end) or (t2_start <= t1_start <= t2_end)
[docs]
def timedelta(date: DateTimeLike, target: DateTimeLike, seconds: bool = True):
"""
Return difference between two time stamps in seconds or days.
"""
delta = to_datetime(date) - to_datetime(target)
if seconds:
return abs(delta.total_seconds())
else:
return abs(delta.days)
[docs]
def day_range(
start_date: Union[datetime.datetime, datetime.date],
end_date: Union[datetime.datetime, datetime.date],
) -> List[datetime.date]:
"""
Return a list of dates between start and end.
"""
start_date = (
start_date.date() if isinstance(start_date, datetime.datetime) else start_date
)
end_date = end_date.date() if isinstance(end_date, datetime.datetime) else end_date
return [
start_date + datetime.timedelta(n)
for n in range(int((end_date - start_date).days) + 1)
]