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

如何基于%Y-%m格式日期获取前N个月的月末日期列表

如何高效获取指定日期前N个月的月末日期列表

给定一个%Y-%m格式的日期(例如2022-03),要获取其前N个月(例如5个月)的月末日期列表,用Python内置的datetime和calendar模块就能高效实现——无需额外依赖,还能自动处理闰年、不同月份天数差异等细节,准确性和效率都有保障。

实现思路

  • 先把输入的字符串日期解析成当月第一天的datetime对象,作为基准日期。
  • 循环N次,每次将基准日期往前推一个月,再用calendar.monthrange直接获取该月最后一天。
  • 把每个月末日期格式化为%Y-%m-%d字符串,收集到结果列表中,最后调整顺序即可。

代码示例

import datetime
import calendar

def get_last_n_month_ends(input_date_str, n):
    # 拆分输入日期,转为当月第一天的日期对象
    year, month = map(int, input_date_str.split('-'))
    current_date = datetime.date(year, month, 1)
    
    result = []
    for _ in range(n):
        # 处理月份回退:1月回退到上一年12月,其他月份直接减1
        if current_date.month == 1:
            prev_month_date = current_date.replace(year=current_date.year-1, month=12)
        else:
            prev_month_date = current_date.replace(month=current_date.month-1)
        
        # 获取该月最后一天
        _, last_day = calendar.monthrange(prev_month_date.year, prev_month_date.month)
        last_date = prev_month_date.replace(day=last_day)
        
        result.append(last_date.strftime('%Y-%m-%d'))
        # 更新基准日期为前一个月的第一天,继续循环
        current_date = prev_month_date
    
    # 反转列表,得到从远到近的月末日期顺序
    result.reverse()
    return result

# 测试示例
print(get_last_n_month_ends('2022-03', 5))
# 输出:['2021-10-31', '2021-11-30', '2021-12-31', '2022-01-31', '2022-02-28']

细节说明

  • calendar.monthrange(year, month)返回元组(当月第一天是周几, 当月总天数),直接取第二个值就能拿到月末日期,不用手动判断各月份天数。
  • 月份回退用replace方法调整年份和月份,逻辑简单,避免了日期计算的潜在错误。
  • 循环得到的初始列表是从近到远的月末日期,反转后就符合题目要求的从远到近的顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:15:50