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

Python如何根据周数获取对应周的起始日期(周始为周一)

问题原因

原代码逻辑存在核心错误,导致结果不符合预期:

  • 直接以每年1月1日为起点累加周数,没有对齐「周起始为周一」的规则:每年1月1日可能是一周中的任意一天,直接累加7的倍数得到的日期自然不会固定是周一。
  • 没有遵循ISO周数的通用计数规则:通用周数计数规则为每年第1周是包含1月4日(即至少4天属于新一年)的周,周一是每周第一天,并非从1月1日所在的自然周开始计数周数。
  • 你给出的示例中周数25对应周一日期2022-06-21存在笔误,实际2021年第25周的周一就是2021-06-21,传入对应年份即可匹配结果。
实现代码

直接使用Python标准库即可实现需求,不需要额外依赖dateutil,提供两种兼容方案:

方案1:格式符直接解析(Python 3.6+ 支持)

利用datetime.strptime内置的ISO周格式符直接解析,代码最简洁:

import datetime
from typing import List

def get_week_monday(iso_year: int, week_num: int) -> datetime.date:
    # 格式符说明:%G=ISO周所属年份,%V=补零的ISO周数,%u=周几(周一为1)
    return datetime.datetime.strptime(f"{iso_year}-{week_num}-1", "%G-%V-%u").date()

# 批量处理周数列表
week_list: List[int] = [25, 26, 27]
target_iso_year = 2021  # 替换为需要查询的周数所属年份
for week in week_list:
    monday_date = get_week_monday(target_iso_year, week)
    print(f"第{week}周 周一日期:{monday_date}")

运行输出:

第25周 周一日期:2021-06-21
第26周 周一日期:2021-06-28
第27周 周一日期:2021-07-05

完全匹配你给出的周25对应日期示例。

方案2:手动计算兼容低版本

如果需要兼容Python 3.6以下版本,可以手动对齐第一周的周一后累加:

import datetime
from typing import List

def get_week_monday(iso_year: int, week_num: int) -> datetime.date:
    # 每年1月4日一定属于当年第1个ISO周
    jan_4th = datetime.date(iso_year, 1, 4)
    # 计算第1周的周一日期
    first_week_monday = jan_4th - datetime.timedelta(days=jan_4th.isoweekday() - 1)
    # 累加对应周数(第1周无需累加,所以周数减1)
    return first_week_monday + datetime.timedelta(weeks=week_num - 1)

# 调用方式和方案1完全一致
week_list: List[int] = [25, 26, 27]
target_iso_year = 2021
for week in week_list:
    print(f"第{week}周 周一日期:{get_week_monday(target_iso_year, week)}")
注意事项
  • 跨年周需要传入ISO周所属年份而非自然年,例如2022年最后一周(第52周)的范围是2022-12-26至2023-01-01,查询时传入iso_year=2022, week_num=52即可拿到正确的周一日期2022-12-26。
  • 如果你的周数计数规则不是ISO标准(比如部分场景自定义每年1月1日所在周为第1周),可以在方案2的基础上调整第一周的锚点日期即可。

内容的提问来源于stack exchange,提问作者Firts_is_science

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:24:38