You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:02:42