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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:01:58