最可靠的方法是使用 calendar.monthrange() 获取当月天数,它返回(首日星期几, 总天数),取第二个值即可;处理上月最后一天应先得本月1号再减1天,避免手动计算月份边界和闰年逻辑。

直接用 calendar.monthrange() 最可靠,别自己算天数或依赖月末日期字符串解析。
用 calendar.monthrange() 获取当月天数
这是 Python 标准库中专为解决这个问题设计的函数,返回一个二元组:(该月第一天星期几, 该月总天数)。你只需要第二个值。
常见错误是试图用 datetime 构造“下个月1号再减1天”,但遇到跨年(如12月→1月)或时区、DST 边界时容易出错。
import calendaryear, month = 2024, 2-
_, last_day = calendar.monthrange(year, month)→last_day是29 - 注意:
month必须是 1–12,传0或13会抛ValueError
需要 datetime.date 对象?组合使用 calendar 和 datetime
如果业务逻辑要求返回一个可参与计算的日期对象(比如做范围查询),就别只拿数字,要构造 date 实例。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
别用字符串拼接再解析(如 f"{year}-{month}-31"),可能因月份天数不足而报 ValueError: day is out of range for month。
from datetime import dateimport calendaryear, month = 2023, 11last_day = calendar.monthrange(year, month)[1]end_date = date(year, month, last_day)
处理动态月份(如“上个月最后一天”)要先归一化
用户常想“当前时间往前推一个月的最后一天”,但直接对 month - 1 可能得 0(1月前是0月),必须手动处理年份进退。
推荐先用 date.replace() + 条件判断,比用 dateutil.relativedelta 更轻量(避免额外依赖)。
- 获取上个月最后一天:
from datetime import date, timedeltatoday = date.today()first_of_this_month = today.replace(day=1)last_of_last_month = first_of_this_month - timedelta(days=1) - 这个写法天然规避了月份/年份边界问题,且不依赖第三方包
- 不要写
today.replace(month=today.month-1)——month=0不合法
真正容易被忽略的是:不同年份同月的最后一天可能差一天(比如2月),而 calendar.monthrange() 内部已完整封装闰年逻辑;自己手写判断年份是否整除4、100、400,既冗余又易错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










