如何基于公历月份首日计算该月某星期几的天数(非迭代)
计算指定月份中目标星期几的天数(非迭代解法)
核心逻辑
一个月最少28天(刚好4周),因此每个星期几至少有4个。要判断是否有5个,只需看该月第29天到最后一天的这几天里,是否包含目标星期几——有则总数为5,无则为4,完全不需要遍历全月。
具体步骤
先明确三个已知参数(编号规则统一即可,以下用0=周日、1=周一……6=周六为例):
首日星期数:该月1号是星期几的编号目标星期数:要统计的星期几的编号该月总天数:对应月份的总天数(如5月31天、4月30天)
- 计算该月超出28天的天数:
extra_days = 该月总天数 - 28(结果只能是1、2、3) - 计算目标星期与首日星期的间隔:
offset = (目标星期数 - 首日星期数) % 7 - 直接判断:如果
offset < extra_days,说明目标星期在第29天及之后的日子里,总数为5;否则为4。
示例验证
- 2026年5月:首日是周四(编号4),总天数31,
extra_days=3;目标是周二(编号2),offset=(2-4)%7=5。5<3不成立,因此5月有4个周二,符合实际。 - 2024年闰年2月:首日是周四(编号4),总天数29,
extra_days=1;目标是周四(编号4),offset=(4-4)%7=0。0<1成立,因此2月有5个周四(1、8、15、22、29号),正确。 - 2024年4月:首日是周一(编号1),总天数30,
extra_days=2;目标是周二(编号2),offset=(2-1)%7=1。1<2成立,因此4月有5个周二(2、9、16、23、30号),正确。
代码实现示例(Python)
def count_weekday_in_month(first_day_week, target_week, month_days): extra_days = month_days - 28 offset = (target_week - first_day_week) % 7 return 5 if offset < extra_days else 4
内容的提问来源于stack exchange,提问作者Michel de Ruiter
相关产品推荐
相关产品推荐

