编码 ISO 一年中的第 53 周问题
Coding ISO Week of Year - Week 53 Problems
我正在尝试编写一个函数来查找一年中的 ISO 周。我找到了关于它的 ISO Week Wiki Page 包括这个算法:
woy = (10 + doy − dow) div 7
它在大多数情况下都有效,但我遇到了两个问题并且不确定如何解决它。
问题 1)第 53 周确实应该是第 1 周。(即 20191230 到 20191231)作为第 53 周出现,但应该是第 1 周。
第 2 期)闰年的第 53 周。 (即 20210101 到 20210103)作为第 0 周出现,但应该是第 53 周。
是否有一种干净的方法 alter/add 该公式来解决上述问题?
引用的维基百科文章确实包含对这些边界情况的说明:
- If the week number thus obtained equals 0, it means that the given date belongs to the preceding (week-based) year.
- If a week number of 53 is obtained, one must check that the date is not actually in week 1 of the following year.
这里的缺点是您仍然需要一个函数 weeks
。如果您没有那么容易获得,那么这是另一种方法:
将给定日期移动到 同一 周的星期四。因此,对于周五、周六或周日,您会倒退,而对于其他日子(周四除外),您会及时向前移动。显然那个星期四的输出应该是相同的,因为我们在同一周。
应用那个日期的公式。显然 dow
现在(星期四)总是 4,所以公式简化为 (6 + doy) div 7
让我们在您提供的示例中使用此方法:
2019 年 12 月 30 日是星期一,因此我们前进到 2020 年 1 月 2 日星期四。对于那个日期,doy
是 2,公式 (6 + doy) div 7
给出 1 作为结果。
2021 年 1 月 1 日是星期五,因此我们倒退到 2020 年 12 月 31 日星期四。对于那个日期,doy
是 366,公式 (6 + doy) div 7
给出 53 作为结果。
我正在尝试编写一个函数来查找一年中的 ISO 周。我找到了关于它的 ISO Week Wiki Page 包括这个算法:
woy = (10 + doy − dow) div 7
它在大多数情况下都有效,但我遇到了两个问题并且不确定如何解决它。
问题 1)第 53 周确实应该是第 1 周。(即 20191230 到 20191231)作为第 53 周出现,但应该是第 1 周。
第 2 期)闰年的第 53 周。 (即 20210101 到 20210103)作为第 0 周出现,但应该是第 53 周。
是否有一种干净的方法 alter/add 该公式来解决上述问题?
引用的维基百科文章确实包含对这些边界情况的说明:
- If the week number thus obtained equals 0, it means that the given date belongs to the preceding (week-based) year.
- If a week number of 53 is obtained, one must check that the date is not actually in week 1 of the following year.
这里的缺点是您仍然需要一个函数 weeks
。如果您没有那么容易获得,那么这是另一种方法:
将给定日期移动到 同一 周的星期四。因此,对于周五、周六或周日,您会倒退,而对于其他日子(周四除外),您会及时向前移动。显然那个星期四的输出应该是相同的,因为我们在同一周。
应用那个日期的公式。显然
dow
现在(星期四)总是 4,所以公式简化为(6 + doy) div 7
让我们在您提供的示例中使用此方法:
2019 年 12 月 30 日是星期一,因此我们前进到 2020 年 1 月 2 日星期四。对于那个日期,
doy
是 2,公式(6 + doy) div 7
给出 1 作为结果。2021 年 1 月 1 日是星期五,因此我们倒退到 2020 年 12 月 31 日星期四。对于那个日期,
doy
是 366,公式(6 + doy) div 7
给出 53 作为结果。