簡體   English   中英

為什么我的腳本不接受有效日期作為用戶輸入?

[英]Why doesn't my script accept a valid date as user input?

如果我給它一個日期01/12/2021 ,該腳本就可以正常工作。 但是,如果我給它另一個日期,例如今天的01/18/2021或任何其他日期,腳本會說該日期無效並提示用戶再次輸入日期。

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)

如果我輸入一些不同的日期,這是我得到的 output:

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.

為什么我的腳本不接受01/12/2021年 1 月 12 日以外的任何日期作為有效輸入?

01/16/2021年 1 月 16 日不是有效日期,因為一年只有 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)

您要求格式dd/mm/yyyy 但是,您輸入的(我假設)是mm/dd/yyyy格式。 如果您嘗試以dd/mm/yyyy格式解析01/18/2021 ,那么您會得到它是 2021 年第 18 個月的第一天的結果(當然,這是不可能的 - 有一年只有 12 個月)。 要解決此問題,您必須將格式更改為mm/dd/yyyy或輸入為18/01/2021

要將輸入檢查器更改為mm/dd/yyyy

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)

請注意,您似乎使用的是dd/mm/yyyy格式的 function datetime時間,但您在原始代碼中使用的是帶有datetime.strptimemm/dd/yyyy格式。 在此代碼中,它僅使用mm/dd/yyyy格式,但您始終可以輕松地將其編輯為dd/mm/yyyy

編輯:看起來你正在使用遞歸。 當然,您應該使用while循環,因為這里不需要遞歸。 此外,您正在使用isValidDate變量,但實際上從未使用或需要它:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM