diff --git a/cctv-scheduler.py b/cctv-scheduler.py index d23d652..c04765f 100644 --- a/cctv-scheduler.py +++ b/cctv-scheduler.py @@ -2,6 +2,7 @@ # pylint: disable=C0103,C0302,C0114,W0621 +import calendar import base64 import json import logging @@ -2264,6 +2265,87 @@ class Do(): ) return True + @staticmethod + def date_calc( + target: datetime.date = datetime.datetime.now(), + amount: int = 0, + period: str = None + ) -> dict: + """Calculating start/end dates for period: day, week, month, year. + + Args: + target (datetime.date, optional): date in the calculation period. Defaults to now. + amount (int, optional): +/- periods. Defaults to 0. + period (str, optional): 'y'|'year','m'|'month','w'|'week','d'|'day'. Defaults to None. + + Raises: + ValueError: 'period' value is wrong. + + Returns: + dict: { + 'start':{'y':int,'m':int,'w':int,'d':int}, + 'end':{'y':int,'m':int,'w':int,'d':int} + }. + """ + if Do.args_valid(locals(), Do.date_calc.__annotations__): + date = {} + if not period: + raise ValueError("'period' value is wrong: " + "''") + elif period == 'd' or period == 'day': + delta = target + datetime.timedelta(days=amount) + target = delta + date['period'] = 'day' + elif period == 'w' or period == 'week': + delta = target + datetime.timedelta(weeks=amount) + target_week = str(delta.year) + '-W' + str(delta.isocalendar()[1]) + target = datetime.datetime.strptime(target_week + '-1', "%G-W%V-%u") + delta = target + datetime.timedelta(days=6) + date['period'] = 'week' + elif period == 'm' or period == 'month': + delta_month = (target.month + amount) % 12 + if not delta_month: + delta_month = 12 + delta_year = target.year + ((target.month) + amount - 1) // 12 + delta_days = calendar.monthrange(delta_year, delta_month)[1] + delta = target = target.replace( + year=delta_year, + month=delta_month, + day=1 + ) + delta = delta.replace( + year=delta_year, + month=delta_month, + day=delta_days + ) + date['period'] = 'month' + elif period == 'y' or period == 'year': + target = target.replace( + year=target.year + amount, + month=1, + day=1 + ) + delta = target.replace( + year=target.year, + month=12, + day=31 + ) + date['period'] = 'year' + else: + raise ValueError("'period' value is wrong: " + period) + date['start'] = { + 'y': target.year, + 'm': target.month, + 'w': target.isocalendar()[1], + 'd': target.day + } + date['end'] = { + 'y': delta.year, + 'm': delta.month, + 'w': delta.isocalendar()[1], + 'd': delta.day + } + return date + if __name__ == "__main__": time_start = datetime.now()