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

Python日期格式化代码多余空格问题排查与修复求助

日期格式化代码的空格问题排查

我写了一段Python日期格式化代码,功能是将两种格式的日期(MM/DD/YYYY和Month DD, YYYY)转换为YYYY-MM-DD格式:

mon = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
]

while True :
    ask_date = input ('Date:')
    try:
        month,day,year= ask_date.split('/')
        if int(month) >=1 and int(month) <=12 and int(day)>=1 and int(day) <= 31 :
            break

    except :
        try :
            old_month,old_day,year=ask_date.split(' ')
            for i in range(len(mon)):
                if old_month == mon[i]:
                   month =i+1
            day = old_day.replace(',',' ')
            if (",") not in old_day :
                pass
            elif int(month) >=1 and int(month) <=12 and int(day)>=1 and int(day) <= 31  :
                break

        except :
            print()
            pass

print(f"{year}-{int(month):02}-{int(day):02}",sep='',end='')

测试时发现,手动输入9/8/1636能得到预期的1636-09-08,但用CS50扩展测试带前后空格的输入(比如" 9/8/1636 ")时,输出变成了1636 -09-08,多了多余的空格,不符合预期。测试案例详情如下:

:) outdated.py exists 
:) input of 9/8/1636 outputs 1636-09-08 
:) input of September 8, 1636 outputs 1636-09-08 
:) input of 10/9/1701 outputs 1701-10-09 
:) input of October 9, 1701 outputs 1701-10-09
---&gt;  :( input of " 9/8/1636 " outputs 1636-09-08 expected "1636-09-08", not "1636 -09-08"
:) input of 23/6/1912 results in reprompt 
:) input of 10 December, 1815 results in reprompt
:) input of October/9/1701 results in reprompt 
:) input of 1/50/2000 results in reprompt 
:) input of December 80, 1980 results in reprompt
:) input of September 8 1636 results in reprompt

问题原因

  1. 输入未去除前后空格:当输入带前后空格时,ask_date.split('/')会得到包含空格的元素,比如" 9/8/1636 "分割后是[' 9', '8', '1636 '],year变量会保留末尾的空格,最终输出时就会出现1636 -09-08的情况。
  2. 英文日期处理时的逗号替换错误:代码中用old_day.replace(',',' ')把逗号换成了空格,比如"8,"会变成"8 ",虽然转成整数不影响,但如果输入本身带空格,可能会引发其他问题。
  3. 英文日期分割逻辑脆弱:用split(' ')分割只能处理单个空格的情况,若输入有多个连续空格(比如September 8, 1636),会得到空字符串元素,导致后续报错。

修复方案

  1. 读取输入后立即去除前后空格:将ask_date = input('Date:')改为ask_date = input('Date:').strip()。
  2. 处理英文日期时,将逗号替换为空字符串而非空格:把day = old_day.replace(',',' ')改为day = old_day.replace(',', '')。
  3. 改用默认的split()分割英文日期:默认split()会分割任意数量的空白字符,避免多空格引发的错误。

修改后的代码

mon = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
]

while True :
    ask_date = input('Date:').strip()  # 去除前后空格
    try:
        month, day, year = ask_date.split('/')
        if 1 <= int(month) <= 12 and 1 <= int(day) <= 31:
            break
    except:
        try:
            # 用默认split处理任意数量空白字符
            parts = ask_date.split()
            if len(parts) != 3:
                raise ValueError
            old_month, old_day, year = parts
            # 查找对应月份数字
            month = None
            for idx, m in enumerate(mon):
                if m == old_month:
                    month = idx + 1
                    break
            if not month:
                raise ValueError
            # 移除逗号
            day = old_day.replace(',', '')
            if 1 <= month <= 12 and 1 <= int(day) <= 31:
                break
        except:
            pass

print(f"{year}-{int(month):02}-{int(day):02}")

内容的提问来源于stack exchange,提问作者xenon oxide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:25:30