执行代码时,主函数中的 else 子句不起作用

问题描述 投票:0回答:1

我正在尝试运行此代码

def main():
    month_name = [
         "January",
         "February",
         "March",
         "April",
         "May",
         "June",
         "July",
         "August",
         "September",
         "October",
         "November",
         "December"
         ]

    while True:
        try:
            date = dated(input("Date: "))
            month, day, year = date

            if int(day) <= 31:
                if 1<= int(month) <= 12:
                    month = month.zfill(2)
                    print(f"{year}-{month}-{day}")
                    break
                else:
                    if int(day) <= 31:
                        for i in range(len(month_name)):
                            if month_name[i] == month:
                                month = i+1
                                month = month.zfill(2)
                                print(f"{year}-{month}-{day}")
                                break
                            else:
                                return ValueError
        except ValueError:
            continue

def dated(s):
      if "/" in s:
        s = s.split("/")
        if len(s[1]) == 1:
            s[1] = s[1].zfill(2)
            return s
        else:
            return s

      else:
        s = s.split(" ")
        s[1] = s[1].replace(",","")
        if len(s[1])== 1:
            s[1] = s[1].zfill(2)
            return s
        else:
            return s





if __name__ == "__main__":
     main()

此代码的目的是,如果用户以 mmddyyyy 格式输入日期,特别是 10/08/1991 或 1991 年 10 月 8 日,它将以 yyyymmdd 格式显示日期,如 1991-10-08。 在执行日期格式 10/08/1991 的此代码时,如果输入在范围内,则它可以工作,否则循环也会中断,但如果输入采用第二种格式 1991 年 10 月 8 日,则代码无法尝试调试我发现为

while True:
        try:
            date = dated(input("Date: "))
            month, day, year = date

            if int(day) <= 31:
                if 1<= int(month) <= 12:
                    month = month.zfill(2)
                    print(f"{year}-{month}-{day}")
                    break

代码运行良好,但在那之后

else:
                    if int(day) <= 31:
                        for i in range(len(month_name)):
                            if month_name[i] == month:
                                month = i+1
                                month = month.zfill(2)
                                print(f"{year}-{month}-{day}")
                                break
                            else:
                                return ValueError

代码不起作用。 如果我输入 1991 年 10 月 10 日,代码将直接跳转到

except ValueError:
    continue

我输入 15/10/1991 代码崩溃了。 问题仅出现在主函数的 if else 部分,过时的函数工作得很好。

python
1个回答
0
投票

这是使用内置

datetime
模块实现相同目标的更简洁的方法。

from datetime import datetime

def convert_date_to_yyyymmdd(date_str):
    try:
        # Try to parse the date in mm/dd/yyyy format
        date_obj = datetime.strptime(date_str, '%m/%d/%Y')
    except ValueError:
        try:
            # Try to parse the date in Month dd, yyyy format
            date_obj = datetime.strptime(date_str, '%B %d, %Y')
        except ValueError:
            # If both formats fail, raise an error
            raise ValueError("The date format is not recognized. Please use mm/dd/yyyy or Month dd, yyyy format.")
    
    # Convert the datetime object to the desired string format
    return date_obj.strftime('%Y-%m-%d')

# Example usage:
date1 = "10/08/1991"
date2 = "October 8, 1991"

print(convert_date_to_yyyymmdd(date1))  # Output: 1991-10-08
print(convert_date_to_yyyymmdd(date2))  # Output: 1991-10-08

返回:

1991-10-08
1991-10-08

请注意,

datetime
模块还有许多其他有用的功能,这将使您免于重新发明轮子。

© www.soinside.com 2019 - 2024. All rights reserved.