编码 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。如果您没有那么容易获得,那么这是另一种方法:

  1. 将给定日期移动到 同一 周的星期四。因此,对于周五、周六或周日,您会倒退,而对于其他日子(周四除外),您会及时向前移动。显然那个星期四的输出应该是相同的,因为我们在同一周。

  2. 应用那个日期的公式。显然 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 作为结果。