如何基于列表实现日历日期的直接后继程序?
日期后继程序开发需求及现有问题
功能需求
编写一个程序,实现以下功能:
- 读取用户输入的日期(格式为YYYY-MM-DD,且需在有效日期范围内)
- 若输入是有效日期中的某一项,返回它的直接后继日期
- 若输入是最后一个有效日期,返回第一个有效日期
现有代码存在的问题
- 不知道如何通过列表循环逻辑而非整数运算实现上述后继日期的获取
- 代码未包含闰年处理逻辑,无法正确验证闰年2月的29日
已完成的部分验证代码(中文翻译版)
import sys input_date = input("请输入YYYY-MM-DD格式的日期:") year, month, day = input_date.split("-") year = int(year) valid_months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"] valid_days = [ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31" ] thirty_day_months = ["04", "06", "09", "11"] if not year in range(1960, 2004 + 1): print("年份必须在1960到2004之间") sys.exit(1) if not month in valid_months: print("月份格式必须为MM,且取值在01到12之间") sys.exit(2) if month == "02": valid_days.remove("31") valid_days.remove("30") valid_days.remove("29") if not day in valid_days: print("错误:无效日期(1)") sys.exit(3) # 验证2月日期 if month in thirty_day_months: valid_days.remove("31") if not day in valid_days: print("错误:无效日期(2)") sys.exit(4) # 验证30天月份的日期 else: input_date = (f"{year}-{month}-{day}") print(input_date) # 验证31天月份的日期
解决方案
1. 补全闰年处理逻辑
先实现闰年判断函数,动态调整2月的有效天数:
def is_leap(year): # 闰年规则:能被4整除但不能被100整除,或能被400整除 return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
在验证2月日期时,根据闰年结果调整有效天数:
if month == "02": # 重置有效天数列表,避免之前的remove操作影响后续判断 valid_days = [f"{d:02d}" for d in range(1, 32)] valid_days.remove("31") valid_days.remove("30") if not is_leap(year): valid_days.remove("29") if not day in valid_days: print("错误:无效日期(1)") sys.exit(3)
2. 用列表循环实现后继日期
先生成1960-2004年的所有有效日期列表,再通过索引查找后继:
# 生成所有有效日期列表 all_valid_dates = [] for y in range(1960, 2005): for m in valid_months: # 确定当月最大天数 if m == "02": max_day = 29 if is_leap(y) else 28 elif m in thirty_day_months: max_day = 30 else: max_day = 31 for d in range(1, max_day + 1): all_valid_dates.append(f"{y}-{m}-{d:02d}") # 查找后继日期 if input_date in all_valid_dates: idx = all_valid_dates.index(input_date) # 最后一项的后继为第一项,否则取索引+1的项 next_date = all_valid_dates[(idx + 1) % len(all_valid_dates)] print(f"后继日期:{next_date}") else: print("输入日期不在有效范围内")
完整整合代码
import sys def is_leap(year): return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) # 初始化基础配置 valid_months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"] thirty_day_months = ["04", "06", "09", "11"] all_valid_dates = [] # 生成1960-2004年所有有效日期 for y in range(1960, 2005): for m in valid_months: if m == "02": max_day = 29 if is_leap(y) else 28 elif m in thirty_day_months: max_day = 30 else: max_day = 31 for d in range(1, max_day + 1): all_valid_dates.append(f"{y}-{m}-{d:02d}") # 读取并验证输入 input_date = input("请输入YYYY-MM-DD格式的日期:") try: year, month, day = input_date.split("-") year = int(year) if not (1960 <= year <= 2004): raise ValueError("年份必须在1960到2004之间") if month not in valid_months: raise ValueError("月份格式为MM,取值需在01-12之间") # 验证日期有效性 if month == "02": max_day = 29 if is_leap(year) else 28 elif month in thirty_day_months: max_day = 30 else: max_day = 31 if not (1 <= int(day) <= max_day): raise ValueError(f"该月份最大日期为{max_day}") except ValueError as e: print(f"错误:{e}") sys.exit(1) # 获取并输出后继日期 idx = all_valid_dates.index(input_date) next_date = all_valid_dates[(idx + 1) % len(all_valid_dates)] print(f"后继日期:{next_date}")
内容的提问来源于stack exchange,提问作者TahaAvadi
相关产品推荐
相关产品推荐

