ISO年度周数编码实现:第53周边界异常问题及公式修正咨询
解决方案
原公式的默认计算前提为:
doy是当年的日序(1月1日为1,平年12月31日为365、闰年为366)dow是ISO标准星期值(周一为1,周日为7,若你的实现里周日为1/0,需要先做转换)div为向下取整的整数除法
你遇到的两个边界问题是因为原公式仅输出了相对于当前年的周数,没有处理跨年度的ISO周归属逻辑,补充以下规则即可解决:
1. 先实现单年是否存在53周的判断逻辑
满足以下任意一个条件的年份,存在53个ISO周:
- 该年的1月1日为星期四
- 该年为闰年,且1月1日为星期三
你可以将该逻辑封装为工具函数has_53_weeks(year),返回布尔值即可。
2. 对初始计算的周数做边界修正
# 计算初始周数 woy = (10 + doy - dow) // 7 current_year = 输入日期的年份 # 处理年初日期算成0周的问题:归属上一年最后一周 if woy == 0: current_year -= 1 woy = 53 if has_53_weeks(current_year) else 52 # 处理年末日期算成53周的问题:判断是否归属下一年第1周 elif woy >= 53: if not has_53_weeks(current_year): woy = 1 current_year += 1
验证示例
- 2021年1月1日:doy=1,dow=5(周五),初始
woy=(10+1-5)//7=0,调用has_53_weeks(2020)返回True(2020是闰年且1月1日为周三),修正后woy=53、归属2020年,符合预期。 - 2019年12月31日:doy=365,dow=2(周二),初始
woy=(10+365-2)//7=53,调用has_53_weeks(2019)返回False,修正后woy=1、归属2020年,符合预期。
内容的提问来源于stack exchange,提问作者CreativelyChris
相关产品推荐
相关产品推荐

