Python无库实现1500-1600年区间周日日期遍历计算问题
问题分析
原代码存在两个核心问题:
- 星期判断逻辑完全错误:
date.day是日期在当月的序号,和星期周期没有固定映射关系,每个月1日对应的星期并不固定,因此取余7的判断只会固定输出每月7、14、21、28这类日期,不可能得到正确的周日列表。 - 原代码依赖
datetime标准库的date、timedelta类,不符合「不使用任何库」的要求。
无库实现思路
完全不依赖任何库实现需求,核心分三步:
- 实现平闰年判断逻辑,确定每个月的天数,支持日期逐日递增遍历
- 用通用星期计算公式(蔡勒公式,适配公历倒推场景)计算任意日期的星期值
- 遍历1500年1月1日到1600年12月31日的所有日期,筛选出周日输出即可
说明:以下实现采用通用的公历倒推规则(和Python datetime模块的日期规则一致),不考虑1582年历史上的历法切换断层。
实现代码
def is_leap(year): # 格里高利历平闰年判断 if year % 400 == 0: return True if year % 100 == 0: return False if year % 4 == 0: return True return False def get_weekday(year, month, day): # 蔡勒公式计算星期,返回值0=周日,1=周一...6=周六 if month < 3: year -= 1 month += 12 c = year // 100 y = year % 100 w = (c//4 - 2*c + y + y//4 + 13*(month+1)//5 + day - 1) % 7 # 负数取模修正 return w if w >= 0 else w + 7 # 初始化起止日期 cur_y, cur_m, cur_d = 1500, 1, 1 end_y, end_m, end_d = 1600, 12, 31 # 平年各月天数 month_days = [31,28,31,30,31,30,31,31,30,31,30,31] sundays = [] while (cur_y, cur_m, cur_d) <= (end_y, end_m, end_d): if get_weekday(cur_y, cur_m, cur_d) == 0: sundays.append(f"{cur_y}-{cur_m:02d}-{cur_d:02d}") # 日期加1 cur_d += 1 # 校验当前月最大天数 max_day = month_days[cur_m - 1] if cur_m == 2 and is_leap(cur_y): max_day += 1 # 日期进位处理 if cur_d > max_day: cur_d = 1 cur_m += 1 if cur_m > 12: cur_m = 1 cur_y += 1 # 输出所有周日,可按需调整输出格式 for date_str in sundays: print(date_str)
代码说明
- 平闰年判断完全遵循公历规则,可准确计算2月天数
- 蔡勒公式做了负数取模修正,1500-1600年区间的星期计算结果和datetime标准库输出完全一致
- 日期遍历完全手动实现,无任何库依赖,从起始日逐日递增到结束日,不会出现日期遗漏或重复
- 周日判断直接匹配星期计算结果,完全避开原代码用日字段取余的逻辑错误
内容的提问来源于stack exchange,提问作者ford
相关产品推荐
相关产品推荐

