Python:给定月、日与星期几,获取对应最近年份
解决方法:获取对应月-日与星期的最近年份
我明白你的问题——datetime.strptime 在没有年份信息时会默认使用1900,这显然不是你想要的最近年份。我们需要自己生成候选年份,验证每个年份的该日期是否匹配指定星期,再选出离当前日期最近的那个。
核心思路
- 以当前年份为中心,先检查前一年、当前年、后一年这三个候选年份(如果这三个里没有匹配的,再扩展搜索范围)。
- 对每个候选年份,创建日期对象,检查该日期的星期是否与给定的星期名称一致。
- 在所有符合条件的日期中,找到离当前日期最近的那个,返回其年份。
可靠代码实现
下面的代码不依赖系统语言环境(避免因locale不同导致星期名称匹配失败),还能处理闰年的特殊情况:
from datetime import datetime def get_recent_year(month, day, weekday_name): # 映射星期名称到datetime.weekday()的返回值(周一=0,周日=6) weekday_map = { 'Monday': 0, 'Tuesday': 1, 'Wednesday': 2, 'Thursday': 3, 'Friday': 4, 'Saturday': 5, 'Sunday': 6 } target_weekday = weekday_map.get(weekday_name) if target_weekday is None: raise ValueError(f"无效的星期名称: {weekday_name}") now = datetime.now() current_year = now.year # 先检查最近的三个年份 candidate_years = [current_year - 1, current_year, current_year + 1] valid_dates = [] for year in candidate_years: try: date = datetime(year, month, day) if date.weekday() == target_weekday: valid_dates.append(date) except ValueError: # 跳过非闰年的2月29日这类无效日期 continue # 如果三个年份都没找到,扩展搜索范围到前后5年 if not valid_dates: for year in range(current_year - 5, current_year + 5): if year in candidate_years: continue try: date = datetime(year, month, day) if date.weekday() == target_weekday: valid_dates.append(date) except ValueError: continue if not valid_dates: raise ValueError("未找到符合该日期与星期的有效年份") # 找到离当前日期最近的日期 closest_date = min(valid_dates, key=lambda d: abs((d - now).days)) return closest_date.year
使用示例
比如你提供的测试数据:
# 测试:3月28日 星期一 year = get_recent_year(3, 28, 'Monday') print(year) # 会输出离当前日期最近的符合条件的年份
为什么你的原代码不行?
datetime.strptime 的设计是当格式字符串中没有年份字段时,默认填充1900年,这是它的固有行为,无法直接修改。所以必须通过生成候选年份并验证的方式来获取最近的有效年份。
内容的提问来源于stack exchange,提问作者chitown88
相关产品推荐
相关产品推荐

