generated from pavel.muhortov/template-bash
add Do.date_calc()
This commit is contained in:
parent
094a3802ec
commit
8d44f2a4f3
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue
Block a user