我正在学习CS50P,在做题时遇到了一些麻烦。我输入 9/8/1636 但输出显示存在 ValueError。我附上了问题和我的代码,我使用 VS 代码。希望有人能帮我一个忙。
问题: 在美国,日期通常按月日年顺序 (MM/DD/YYYY) 进行格式化,也称为中端顺序,这可以说是糟糕的设计。该格式的日期无法轻松排序,因为日期的年份排在最后而不是最前面。例如,尝试在任何程序(例如电子表格)中按时间顺序排序,例如 2/2/1800、3/3/1900 和 1/1/2000。该格式的日期也含糊不清。哈佛成立于 1636 年 9 月 8 日,但 9/8/1636 也可以解释为 1636 年 8 月 9 日! 幸运的是,计算机倾向于使用 ISO 8601,这是一项国际标准,规定日期应按年-月-日 (YYYY-MM-DD) 顺序进行格式化,无论在哪个国家/地区,将年份格式化为四位数字,将月份格式化为两位数,和两位数的日期,根据需要“填充”每个前导零。 在名为 outdated.py 的文件中,实现一个程序,提示用户输入日期(anno Domini),按月日年顺序,格式如 9/8/1636 或 1636 年 9 月 8 日,其中后者中的月份可能是可以是下面列表中的任意值: [ “一月”, “二月”, “行进”, “四月”, “可能”, “六月”, “七月”, “八月”, “九月”, “十月”, “十一月”, “十二月” ] 然后以 YYYY-MM-DD 格式输出相同的日期。如果用户输入的任一格式都不是有效日期,则再次提示用户。假设每个月不超过31天;无需验证一个月是否有 28 天、29 天、30 天或 31 天。
我向 GPT-4 寻求帮助,但没有成功。我真的不知道该怎么办。请帮助我。
month_list = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
]
while True:
try:
date = input('Please enter a date in month-day-year order: ').replace(' ','/').replace(',','/')
date_list = list(date.split('/'))
month = date_list[0]
day = date_list[1]
year = date_list[2]
if month in month_list:
month = month_list.index(month) + 1
elif month.isdigit() and 1<=int(month)<=12:
month=int(month)
else:
print('Month should be a valid month name or a number between 1 and 12.')
continue
if 1<=int(day)<=31:
print(f'{year}-{month:02d}-{day:02d}')
else:
print('Day should be between 1 and 31.')
continue
except ValueError:
print('Date invalid, please enter again.')
尝试将
print(f'{year}-{month:02d}-{month:02d}')
替换为 print(f'{year}-{int(month):02d}-{int(month):02d}')
。
格式化程序
02d
需要一个整数,而不是字符串,请参阅这个答案:https://stackoverflow.com/a/36543850/18189622
一般来说,我建议不要像您那样广泛使用
try
和 except
,或者至少删除它或注释掉它以进行调试,然后您将收到错误消息,更清楚地显示哪些行导致错误。