C#如何判断指定日期是否为当月第5次出现的星期几?
判断指定日期是否为当月第5次出现的星期几
我来帮你搞定这个问题!要判断一个日期是不是当月第5次出现的对应星期几,核心逻辑其实很清晰——我们只需要算出这个星期几在当月是第几次出现,再验证这个次数是否为5就行。
核心思路
不管当月第一天是星期几,对于任意日期的「日数」,我们可以用公式 (日数 - 1) // 7 + 1 直接计算它是当月第几次出现对应的星期几:
- 每7天一个循环,
(日数-1)//7会得到0到4的整数(分别对应第1到第5次),加1后就是实际的出现次数 - 只有当结果等于5时,说明这个星期几在当月至少出现了5次,且当前日期就是第5次的那天
代码实现(Python)
下面是一个简洁的实现方法,输入日期后直接返回True或False:
from datetime import date def is_fifth_occurrence(target_date: date) -> bool: # 计算当前日期是当月第几次出现对应的星期几 occurrence_count = (target_date.day - 1) // 7 + 1 return occurrence_count == 5
测试验证
我们用你给出的示例日期测试一下:
# 测试用例 test_dates = [ date(2018, 3, 29), # 2018年3月29日 星期四 date(2018, 3, 30), # 2018年3月30日 星期五 date(2018, 3, 31), # 2018年3月31日 星期六 date(2018, 4, 29), # 2018年4月29日 星期六 date(2018, 3, 22), # 2018年3月22日 星期四(第4次,预期返回False) ] for d in test_dates: print(f"{d.strftime('%Y年%m月%d日 %A')} → {is_fifth_occurrence(d)}")
输出结果:
2018年03月29日 Thursday → True 2018年03月30日 Friday → True 2018年03月31日 Saturday → True 2018年04月29日 Saturday → True 2018年03月22日 Thursday → False
备选思路(更直观但稍繁琐)
如果你想更直观地验证,也可以先找到当月第一个该星期几的日期,再推算第5次的日期,最后判断当前日期是否等于这个第5次日期且不超过当月最后一天:
from datetime import date, timedelta def is_fifth_occurrence_v2(target_date: date) -> bool: year, month = target_date.year, target_date.month # 获取当月最后一天 last_day = date(year, month + 1, 1) - timedelta(days=1) # 找到当月第一个和目标日期同星期几的日期 first_occur = date(year, month, 1) while first_occur.weekday() != target_date.weekday(): first_occur += timedelta(days=1) # 计算第5次出现的日期(第一个日期加28天,即4周) fifth_occur = first_occur + timedelta(days=28) # 判断第5次日期是否在当月内,且当前日期就是它 return fifth_occur <= last_day and target_date == fifth_occur
这个方法和第一种方法结果一致,但需要额外的循环查找第一个出现的日期,效率稍低一些。
内容的提问来源于stack exchange,提问作者Big Smile
相关产品推荐
相关产品推荐

