如何提示输入直到日期格式和时间格式正确?

How to prompt input until date format and time format is correct?

我正在做一个活动策划,我想提示开始日期和结束日期。验证一直有效到开始日期和开始时间,但在结束日期和时间期间出现问题。 当结束日期格式不正确时,不再提示结束日期,而是再次提示开始时间,结束时间也一样。

import datetime as dt

date_format = "%d-%m-%Y"
time_format = "%H:%M"
start_date = input("Please enter start date: ")
while True:
     try:
          dt.datetime.strptime(start_date, date_format)
          start_time = input("Please enter start time: ")
          try:
               dt.datetime.strptime(start_time, time_format)
               end_date = input("Please enter end date: ")
               try:
                    dt.datetime.strptime(end_date, date_format)
                    end_time = input("Please enter end time: ")
                    try:
                         dt.datetime.strptime(end_time, time_format)
                         print(start_date,start_time)
                         print(end_date,end_time)
                    except:
                         print("This is the incorrect time string format. It should be HH:MM")
               except:
                    print("This is the incorrect date string format. It should be DD-MM-YYYY")
          except:
               print("This is the incorrect time string format. It should be HH:MM")          
     except:
          print("This is the incorrect time string format. It should be DD-MM-YYYY")
          start_date = input("Please enter start date: ")

对每个提示使用 while-loop

import datetime as dt

date_format = "%d-%m-%Y"
time_format = "%H:%M"

while True:
    start_date = input("Please enter start date: ")
    try:
        dt.datetime.strptime(start_date, date_format)
        break
    except:
        continue

while True:
    start_time = input("Please enter start time: ")
    try:
        dt.datetime.strptime(start_time, time_format)
        break
    except:
        continue

while True:
    end_date = input("Please enter end date: ")
    try:
        dt.datetime.strptime(end_date, date_format)
        break
    except:
        continue

while True:
    end_time = input("Please enter end time: ")
    try:
        dt.datetime.strptime(end_time, time_format)
        break
    except:
        continue

print(start_date, start_time)
print(end_date, end_time)

如果在执行过程中发生错误,一切都会在 while true 之后重新开始,即在 start_time

考虑使用简单的状态机:

def prompt_start_time():
  #get input, do something and validate format
  if input_validated: 
     next_state = "prompt_date"
     return start_time, next_state
   else:
     return None, "prompt_start_time"

def prompt_date():
  #do something and return prompt date
  if input_validated: 
     next_state = "end_date"
  else:
     next_state = "prompt_date"
  return start_date, next_state

def end_date():
  #...

state_machine = {"prompt_start_time": prompt__start_time, "prompt_date":prompt_date, "end_date": end_date}

while True:
  value, state = state_machine[current_state]()
  current_state = state

这是一种简洁的 Pythonic 方法:

import datetime as dt

date_format = "%d-%m-%Y"
time_format = "%H:%M"

def get_date(date_format, input_message):

    date = None

    while True:
        try:
            date = input(input_message)
            dt.datetime.strptime(date, date_format)
        except:
            print("This is the incorrect date string format. It should be DD-MM-YYYY")
            # Error! Return to the start of the loop
            continue
        else:
            # Success! Exit loop
            break

    return date


def get_time(time_format, input_message):

    time = None

    while True:
        try:
            time = input(input_message)
            dt.datetime.strptime(time, time_format)
            
        except:
            print("This is the incorrect time string format. It should be HH:MM")
            # Error! Return to the start of the loop
            continue
        else:
            # Success! Exit loop
            break

    return time


start_date = get_date(date_format, "Please enter start date: ")
start_time = get_time(time_format, "Please enter start time: ")
end_date = get_date(date_format, "Please enter end date: ")
end_time = get_time(time_format, "Please enter end time: ")
  1. 我们创建了 2 个函数:一个用于日期输入,另一个用于时间输入
  2. 然后我们通过更改作为参数传递的输入消息来调用这些函数

输入验证逻辑包含在2个函数中,这样代码维护起来会更容易。

关于如何输入验证的说明已完成: 这里我们使用 try/except/else:

  • 如果 try 子句引发异常,它将执行 except

    中的内容
  • 如果try子句没有抛出异常,就会执行else

    中的代码
  • if in except: we are here because input is wrong, so we print a message, and we use continue order to go directly at the start of the loop, in命令再次执行try中的代码。

  • 如果我们在else:输入OK,所以我们使用break以便离开while循环。