Source code for datemore.utils
# -*- coding: utf-8 -*-
import datetime
import typing
import pytz
import datemore
if typing.TYPE_CHECKING: # pragma: no cover
import pytz.tzfile
import datemore.datetime
import datemore.time
DateType = typing.TypeVar(
"DateType",
"datemore.datetime.Datetime",
"datemore.date.Date",
datetime.datetime,
datetime.date,
)
[docs]def to_local_time(
date: datetime.datetime, tz: pytz.tzfile = pytz.timezone("Europe/Berlin")
) -> datetime.datetime:
"""Returns a given date converted to local time
"""
localized = tz.localize(date)
if not isinstance(localized, datetime.datetime):
raise ValueError
return localized
[docs]def is_on_weekend(date: datetime.datetime) -> bool:
"""Returns if a given date is a sunday or saturday
"""
weekday = to_local_time(date).strftime("%A")
return weekday.lower() in ["saturday", "sunday"]
[docs]def add_offset(
date: DateType, **kwargs: int
) -> typing.Union[datetime.datetime, datetime.date]:
"""Adds a delta offset to a given datetime date object
"""
new_date = date + datetime.timedelta(**kwargs)
return new_date
[docs]def add_days(
date: DateType, days: int
) -> typing.Union[datetime.datetime, datetime.date]:
"""Adds a number of days to a given datetime date object
"""
return add_offset(date, days=days)
[docs]def subtract_days(
date: DateType, days: int
) -> typing.Union[datetime.datetime, datetime.date]:
"""Subtracts a number of dates from a given datetime date object
"""
return add_days(date, -days)
[docs]def yesterday(date: DateType) -> typing.Union[datetime.datetime, datetime.date]:
"""Returns the date one day before the given date
"""
return subtract_days(date, 1)
[docs]def tomorrow(date: DateType) -> typing.Union[datetime.datetime, datetime.date]:
"""Returns the date one day after the given date
"""
return add_days(date, 1)
[docs]def closest_future_date(
date: "datemore.datetime.DatetimeType", time: "datemore.time.TimeType"
) -> "datemore.datetime.DatesType":
"""Returns the closest date for a future date with a given hour
"""
future_date = date if date.time() < time else tomorrow(date)
if isinstance(future_date, datemore.datetime.Datetime):
future_date = future_date.native()
return datemore.datetime.Datetime.from_native(
datetime.datetime.combine(future_date, time)
)
[docs]def next_full_hour(date: datetime.datetime) -> datetime.datetime:
"""Returns the closest date at full hour
"""
return date.replace(hour=date.hour + 1, minute=0, second=0, microsecond=0)