【问题标题】:Coding ISO Week of Year - Week 53 Problems编码 ISO 一年中的一周 - 第 53 周的问题
【发布时间】:2021-10-31 12:57:08
【问题描述】:

我正在尝试编写一个函数来查找一年中的 ISO 周。我找到了关于它的ISO Week Wiki Page,其中包含这个算法:

woy = (10 + doy − dow) div 7

它在大多数情况下都有效,但我有两个问题,不知道如何解决它。

问题 1)第 53 周确实应该是第 1 周。(即 20191230 到 20191231)作为第 53 周出现,但应该是第 1 周。

问题 2) 闰年第 53 周。 (即 20210101 到 20210103)作为第 0 周发布,但应该是第 53 周。

是否有一种干净的方法来更改/添加到该公式以解决上述问题?

【问题讨论】:

  • 您有哪些可用的输入?只有一年中的一天和一周中的一天?或者您是否有逻辑添加一天或多天的日期?或者,您的编程环境是什么,输入是什么(日期对象?序列号?日期部分的单独值,...)?公式的简单性取决于此。

标签: algorithm time iso iso8601 week-number


【解决方案1】:

引用的 Wikipedia 文章确实包含这些边界情况的说明:

  • 如果这样获得的周数等于0,则表示给定日期属于上一个(基于周)的年份。
  • 如果获得的周数为 53,则必须检查该日期是否实际上不在下一年的第 1 周。

     

这里的缺点是你仍然需要一个函数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。

【讨论】:

  • 感谢您的帮助/见解! - 我将努力实施您指出的第二个选项。 - 我对第一个选项很感兴趣,但不确定“周”功能是什么?如果我知道它的作用,我可以自己编程吗?是一年中的天数 / 7 这么简单,还是更复杂一些?
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 2023-03-29
  • 2010-10-24
  • 2018-07-05
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多