Сценарий работает нормально, если я даю ей дату {{x0}}. Но если я даю ей еще одну дату, как сегодня как {{{x1}}, либо любой другой скрипт, говорит, что дата недействительна и предложит пользователю вводить дату снова.

def print_reports(interactive,aws_account,aws_account_number):
    inputDate = input("Enter the date in format 'dd/mm/yyyy': ")
    day,month,year = inputDate.split('/')
    isValidDate = True
    try:
        datetime(int(year),int(month),int(day))
    except ValueError :
        isValidDate = False
        print("Date is not valid.")
        print_reports(interactive,aws_account,aws_account_number)

    if(isValidDate) :
        print(f"Input date is valid: {inputDate}")
        format= "%m%d%Y"
        inputDate = datetime.strptime(inputDate,"%m/%d/%Y")
        inputDate = inputDate.strftime(format)
    else:
        print(f"Input date is not valid: {inputDate}")
        print_reports(interactive,aws_account,aws_account_number)
    myclient = connect_db()
    mydb = myclient["aws_inventories"]
    instance_col = "ec2_list_" + inputDate
    instance_col = mydb[instance_col]
    print_reports(interactive,aws_account,aws_account_number)

Вот результат, который я получу, если введу несколько разных дат:

Enter the date in format 'dd/mm/yyyy': 01/12/2021
Input date is valid: 01/12/2021
Enter the date in format 'dd/mm/yyyy': 01/13/2021
Date is not valid.
Enter the date in format 'dd/mm/yyyy': 01/14/2021
Date is not valid.
Enter the date in format 'dd/mm/yyyy': 01/15/2021
Date is not valid.
Enter the date in format 'dd/mm/yyyy': 01/16/2021
Date is not valid.

Почему мой скрипт не примет свидание, отличных от {{x0}} как действительный ввод?

0
Tim Dunphy 19 Янв 2021 в 01:54

2 ответа

Лучший ответ

Вы запрашиваете формат dd/mm/yyyy. Тем не менее, вы вводите (как я предполагаю) в формате mm/dd/yyyy. Если вы попытаетесь разобрать 01/18/2021 в формате dd/mm/yyyy, то вы получите результат, что это первый день 18-го месяца 2021 года (что, конечно, невозможно - есть всего 12 месяцев в году). Чтобы исправить это, вам придется либо изменить формат на mm/dd/yyyy, либо ввести как 18/01/2021.

Чтобы изменить входную проверку на {{x0}}:

def print_reports(interactive, aws_account, aws_account_number):
    inputDate = input("Enter the date in format 'mm/dd/yyyy': ")
    month, day, year = inputDate.split('/') # changed order of month and day
    isValidDate = True
    try:
        datetime(int(year), int(month), int(day))
    except ValueError:
        isValidDate = False
        print("Date is not valid.")
        print_reports(interactive, aws_account, aws_account_number)

    if isValidDate:
        print(f"Input date is valid: {inputDate}")
        format = "%m%d%Y"
        inputDate = datetime.strptime(inputDate,"%m/%d/%Y")
        inputDate = inputDate.strftime(format)
    else:
        print(f"Input date is not valid: {inputDate}")
        print_reports(interactive,aws_account,aws_account_number)
    myclient = connect_db()
    mydb = myclient["aws_inventories"]
    instance_col = "ec2_list_" + inputDate
    instance_col = mydb[instance_col]
    print_reports(interactive,aws_account,aws_account_number)

Обратите внимание, что похоже, что вы используете функцию datetime с форматом dd/mm/yyyy, но вы используете формат mm/dd/yyyy с datetime.strptime в исходном коде. В этом коде используется только формат mm/dd/yyyy, но вы всегда можете легко изменить его на dd/mm/yyyy.

Редактировать: выглядит так, будто вы используете рекурсию. Конечно, вместо этого вы должны использовать петлю {{x0}}, поскольку рекурсия не нужна здесь. Кроме того, вы используете переменную {{x1}}, но это

def print_reports(interactive, aws_account, aws_account_number):
    while True:
        inputDate = input("Enter the date in format 'mm/dd/yyyy': ")
        month, day, year = inputDate.split('/') # changed order of month and day
        try:
            datetime(int(year), int(month), int(day))
        except ValueError:
            print("Date is not valid.")
            continue

        print(f"Input date is valid: {inputDate}")
        format = "%m%d%Y"
        inputDate = datetime.strptime(inputDate,"%m/%d/%Y")
        inputDate = inputDate.strftime(format)

        myclient = connect_db()
        mydb = myclient["aws_inventories"]
        instance_col = "ec2_list_" + inputDate
        instance_col = mydb[instance_col]
0
megargayu 18 Янв 2021 в 23:11

01/16/2021 не является допустимой датой, поскольку в течение года всего 12 месяцев, а не 16;).
Ваш код должен быть таким:

def print_reports(interactive, aws_account, aws_account_number):
    inputDate = input("Enter the date in format 'dd/mm/yyyy': ")
    day, month, year = inputDate.split('/')
    try:
        datetime(int(day), int(month), int(year))
    except ValueError as e:
        print("Date is not valid.")
        return False

    print(f"Input date is valid: {inputDate}")
    inputDate = datetime.strptime(inputDate,"%d/%m/%Y")
    return True
myclient = connect_db()
mydb = myclient["aws_inventories"]
instance_col = mydb["ec2_list_" + inputDate]
while not success:
    global success
    success = print_reports(interactive, aws_account, aws_account_number)
1
frederic 18 Янв 2021 в 23:10