You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python无库实现1500-1600年区间周日日期遍历计算问题

问题分析

原代码存在两个核心问题:

  • 星期判断逻辑完全错误:date.day是日期在当月的序号,和星期周期没有固定映射关系,每个月1日对应的星期并不固定,因此取余7的判断只会固定输出每月7、14、21、28这类日期,不可能得到正确的周日列表。
  • 原代码依赖datetime标准库的date、timedelta类,不符合「不使用任何库」的要求。
无库实现思路

完全不依赖任何库实现需求,核心分三步:

  1. 实现平闰年判断逻辑,确定每个月的天数,支持日期逐日递增遍历
  2. 用通用星期计算公式(蔡勒公式,适配公历倒推场景)计算任意日期的星期值
  3. 遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:54:29