日期转年度周数:是否存在对应的转换算法?
日期转年度周数的算法存在吗?
当然存在,这类算法已经非常成熟,不同场景下会遵循不同的周数定义,其中ISO 8601标准是目前全球应用最广泛的规范,下面详细说明:
核心规范:ISO 8601周数规则
- 每周以周一为起始日,周日为结束日
- 第1周的判定:包含该年度第一个周四的周(等价于包含1月4日的周,或者至少有4天落在当年的周)
- 跨年度情况:如果某一周的大部分天数属于下一年,那么该周会被算作下一年的第1周;反之,年初的部分周可能属于上一年的最后一周
手动计算算法(ISO 8601为例)
- 确定给定日期的星期几(周一=1,周日=7)
- 找到当年的第一个周四:根据1月1日的星期数推导,比如1月1日是周二,第一个周四就是1月3日;如果1月1日是周五,第一个周四就是1月7日
- 计算给定日期与第一个周四的天数差:
天数差 = 给定日期的日序数 - 第一个周四的日序数 - 周数计算:
周数 = (天数差 // 7) + 1。如果给定日期在第一个周四之前且属于上一年的最后一周,需切换到上一年的周数(比如2023年12月31日是周日,属于2024年第1周)
其他常见周数定义
- 美式周定义:每周以周日为起始日,第1周是包含1月1日的周(哪怕这一周只有1天在当年)
- 简化地区定义:第1周是1月1日所在的周,周一为起始日,不管周内天数占比
实际实现
几乎所有主流编程语言都内置了现成的工具,无需手动实现算法:
- Python:
datetime.date(2023,12,31).isocalendar()返回(2024, 1, 7),即2024年第1周、周日 - Java:
LocalDate.of(2023,12,31).get(WeekFields.ISO.weekOfWeekBasedYear())返回1 - JavaScript:
new Date(2023,11,31).toLocaleDateString('en-GB', {week: 'numeric', year: '2024'})(需匹配对应周规则的语言环境)
内容的提问来源于stack exchange,提问作者J. Ike
相关产品推荐
相关产品推荐

