CS50 Python作业Outdated问题:英文月份格式日期处理异常求助
CS50作业3「Outdated」日期转换问题
输入9/8/1636这类数字分隔格式的日期时,代码能正确转为yyyy-mm-dd格式输出;但输入September 8, 1636这类英文月份格式的日期时,程序会重复提示输入,无法完成转换。
原代码
# 初始化月份列表 month_li = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] # 循环直到输入合法日期 while True: # 提示用户输入日期(格式:9/8/1636 或 september 8, 1636) input_date = input("Date (in month/day/year order): ").strip() # 尝试转换为yyyy-mm-dd格式 try: # 按"/"分割并转为整数 month, day, year = map(int, input_date.split("/")) # 检查月日范围 if 1 <= month <= 12 and 1 <= day <= 31: # 格式化输出 print(year,f"{month:02}",f"{day:02}", sep = "-") break else: # 检查是否以字母开头(英文月份格式) if not input_date[0].isdigit(): # 按空格分割 month, day, year = input_date.split(" ") # 去除日期后的逗号 day = day.replace(',', '') # 转换日和年为整数 day = int(day) year = int(year) # 月份首字母大写以兼容大小写 month = month.capitalize() # 检查月份是否合法且日期范围正确 if month in month_li and (1 <= day <= 31): print(year,f"{month_li.index(month) + 1:02}", f"{day:02}", sep = "-") break except: pass
问题原因
英文月份格式的处理逻辑被放在了数字格式判断的else分支里,但输入英文格式时,第一步执行input_date.split("/")就会抛出异常(因为没有"/"分隔符),直接进入except块的pass,根本不会走到else分支去处理英文格式。
修正方案
把两种格式的处理逻辑分开:先尝试处理数字格式,失败则在except块中尝试处理英文格式,各自用独立的合法性校验。
修正后代码
# 初始化月份列表 month_li = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] # 循环直到输入合法日期 while True: input_date = input("Date (in month/day/year order): ").strip() # 先尝试处理数字分隔格式 try: month, day, year = map(int, input_date.split("/")) if 1 <= month <= 12 and 1 <= day <= 31: print(f"{year}-{month:02}-{day:02}") break except: # 数字格式处理失败,尝试处理英文月份格式 try: # 按空格分割,英文格式为 "Month Day, Year",分割后得到三个部分 parts = input_date.split() if len(parts) != 3: continue month_str, day_str, year_str = parts # 去除日期后的逗号 day_str = day_str.replace(',', '') day = int(day_str) year = int(year_str) # 统一月份首字母大写 month_str = month_str.capitalize() # 校验月份合法性和日期范围 if month_str in month_li and 1 <= day <= 31: month_num = month_li.index(month_str) + 1 print(f"{year}-{month_num:02}-{day:02}") break except: # 两种格式都不合法,继续循环 pass
内容的提问来源于stack exchange,提问作者FlyingDutch
相关产品推荐
相关产品推荐

