@Hassle

Как сделать подсчет даты в python с помощью datetime()?

Задача: Произвести подсчет даты в увеличение, имея диапазон дат (вводимые с клавиатуры).

Используемая библиотека: желательно datetime, но если есть вариант лучше, то я не против.

В чем проблема?: код написанный мною может подсчитывать только в диапазоне не превышающий больше месяца.

Изначальный код:
def datplus(dat, post, ybil):
	yearint = int(dat.year + 1)
	monthint = int(dat.month + 1)
	datint = int(dat.day + 1)
	
	a = post.replace(day = 1)
	b = ybil.replace(day = 1)

	maxdays = b - a
	mindays = int(dat.day) - 1
	mindays += 1

	if mindays == maxdays.days and dat.month == 12:
		try:
			yearplus = dat.replace(day = 1, month = 1, year = yearint)
		except ValueError:
			print("\nОшибка: Программа не может просчитать дату больше 2-х месяцев\nЗавершаю сессию...")
			sys.exit()
		else:
			return yearplus

	elif mindays == maxdays.days:
		try:
			monthplus = dat.replace(day = 1, month = monthint)
		except ValueError:
			print("\nОшибка: Программа не может просчитать дату больше 2-х месяцев\nЗавершаю сессию...")
			sys.exit()
		else:
			return monthplus

	else:
		try:
			datplus = dat.replace(day = datint)
		except ValueError:
			print("\nОшибка: Программа не может просчитать дату больше 2-х месяцев\nЗавершаю сессию...")
			sys.exit()
		else:
			return datplus


Код выше представляет собой кастиль, который я сделал пока не решу проблему, но т.к. вы читаете этот пост, то понятно, что у меня так и не получилось.

На данный момент код немного изменен, и то что я сделал могло бы решить проблему, но я никак не могу избавить от a = post.replace(day = 1), который не дает мне перейти на следующий месяц.

Часть измененного кода:
def datplus(dat, post, ybil):
	yearint = int(dat.year + 1)
	monthint = int(dat.month + 1)
	datint = int(dat.day + 1)
	

	a = post.replace(day = 1)
	aint_month = int(a.month + 1)
	aint_month_year = int(a.year + 1)
	b = a.replace(month = aint_month)

	maxdays = b - a
	mindays = int(dat.day) - 1
	mindays += 1

	if mindays == maxdays.days:
		a.replace(month = aint_month)
		#выполняется только один раз, поэтому на следующий день 'а' снова равен post.replace(day = 1)

	if mindays == maxdays.days and a.month == 12:
		a.replace(month = aint_month, year = yearint)
		b = a.replace(month = aint_month, year = yearint)
		maxdays = b - a
		mindays = int(dat.day) - 1
		mindays += 1
		#выполняется только один раз, поэтому на следующий день 'а' снова равен post.replace(day = 1)

# после if mindays == maxdays.days and dat.month == 12: ничего не менялось
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
SoreMix
@SoreMix
yellow
Ничего не понял, что вы сделать то пытаетесь? При каких вводных вызываются исключения?
Используйте встроенную функцию timedelta, если вам прибавить надо что-то с переходом на следующий месяц / год. Ну и можно добавит relativedelta

from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

now = datetime.now()
# 2021-02-01

print(now + timedelta(days=30))
# 2021-03-03

print(now + timedelta(days=777))
# 2023-03-20

print(now + relativedelta(months=3))
# 2021-05-01
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Spark Equation Санкт-Петербург
от 250 000 ₽
ClickNet Санкт-Петербург
от 50 000 до 90 000 ₽
Eltex Новосибирск
от 80 000 ₽
26 февр. 2021, в 05:09
3000 руб./за проект
26 февр. 2021, в 04:16
3000 руб./за проект
26 февр. 2021, в 01:40
1000 руб./за проект