如何基于%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
相关产品推荐
相关产品推荐

