Логика, которую вы пытаетесь сделать, сложна
Насколько я понимаю, вы используете систему подписки, основанную на количестве дней, а не дат, поэтому для вычисления даты окончания вам просто нужно это:
- дата начала (например, 01/11/2018)
- количество дней (например, 30 дней)
- исключенные дни (например, пятница, суббота)
# day are like this
# Fri
# Sat
# Sun
# Mon
# Tue
# Wed
# Thu
# start day
def get_expiry_date(start_date, number_of_days, excluded_days = None):
""" compute end date of subcription period """
if excluded_days is None:
excluded_days = []
# check params
start_date = str(start_date)
if number_of_days < 1:
raise exception.UserError(_('Number of days should be > 0!!')) # import the translate "_" method
if len(excluded_days) > 5:
raise exception.UserError(_('To much excluded days!!')) # import the translate "_" method
date_format = '%Y-%m-%d'
end_date = datetime.strptime(start_date, date_format)
# compute end date
# keeping adding one day until you finish your days
add_one_day = timedelta(days=1)
while number_of_days > 1:
end_date += add_one_day
if end_date.strftime('%a') not in excluded_days:
# day is not excluded compute it
number_of_days += -1
return end_date.strftime(date_format)
И это тестовое значение, которое вы можете проверить:
print get_expiry_date('2018-11-01', 30, ['Fri', 'Sat']) # 2018-12-12
print get_expiry_date('2018-11-01', 30, ['Fri']) # 2018-12-05
print get_expiry_date('2018-11-01', 30, []) # 2018-11-30
print get_expiry_date('2018-11-01', 90, []) # 2019-01-29
print get_expiry_date('2018-11-01', 30, ['Mon', 'Thu']) # 2018-12-11
Если у вас есть все готовые работающие системы, вы можете использовать это:
def get_expiry_date(start_date, end_date, excluded_days = None):
if excluded_days is None:
excluded_days = []
start_date = str(start_date)
end_date = str(end_date)
date_format = '%Y-%m-%d'
# compute number of days
number_of_days = (datetime.strptime(end_date, date_format) - datetime.strptime(start_date, date_format)).days
expiry_date = datetime.strptime(start_date, date_format)
if len(excluded_days) > 5:
raise Exception('To much excluded days!!')
# keeping adding one day until you finish your days
one_day = timedelta(days=1)
while number_of_days > 0:
expiry_date += one_day
# if day is not excluded reduce the number of left days
if expiry_date.strftime('%a') not in excluded_days:
number_of_days += -1
return expiry_date.strftime(date_format)
print get_expiry_date('2018-11-01', '2018-11-30', ['Fri', 'Sat']) # 2018-12-12