如何编写函数获取带年份的上周周数(周起始为周一)
实现返回带年份的上周周数函数
要实现符合你需求的函数,核心是基于**ISO周(周一至周日)**的规则计算,同时妥善处理跨年场景,具体逻辑如下:
- 先获取目标日期的ISO年份和周数
- 如果当前周数大于1,上周就是当前年份的周数减1
- 如果当前是当年第1周,上周就是上一年的最后一个ISO周
完整代码
import datetime def get_last_week_str(target_date=None): # 默认使用当前日期,也可传入指定日期自定义计算 if target_date is None: target_date = datetime.date.today() iso_year, iso_week, _ = target_date.isocalendar() if iso_week > 1: last_year = iso_year last_week = iso_week - 1 else: # 处理跨年场景:取上一年的最后一周 last_year = iso_year - 1 # 每年12月28日必然属于当年最后一周,用它获取最后周数 last_week = datetime.date(last_year, 12, 28).isocalendar()[1] # 格式化为「YYYY_WXX」格式,周数补两位零 return f"{last_year}_W{last_week:02d}"
测试验证
几个典型场景的结果:
- 当日期为2023年5月8日(周一,属于2023_W19),调用函数返回
2023_W18,完全符合你的示例需求 - 当日期为2024年1月1日(周一,属于2024_W01),函数返回
2023_W52(2023年最后一周) - 当日期为2023年12月24日(周日,属于2023_W52),函数返回
2023_W51
为什么不直接减7天?
直接给当前日期减7天的方式存在漏洞:比如2024年1月1日(周一)减7天得到2023年12月25日,而这一天属于2024年第1周,会错误返回2024_W01,而非我们需要的2023_W52。通过ISO周数的逻辑计算能避免这类问题,更准确贴合需求。
内容的提问来源于stack exchange,提问作者lucy
相关产品推荐
相关产品推荐

