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
|
# pylint: disable=C0103,C0302,C0114,W0621
|
||||||
|
|
||||||
|
|
||||||
|
import calendar
|
||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
@ -2264,6 +2265,87 @@ class Do():
|
||||||
)
|
)
|
||||||
return True
|
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__":
|
if __name__ == "__main__":
|
||||||
time_start = datetime.now()
|
time_start = datetime.now()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user