算法:根据周数获取明年日期工作班次类型

Posted

技术标签:

【中文标题】算法:根据周数获取明年日期工作班次类型【英文标题】:algorithm: get next year date work shift type according week number 【发布时间】:2017-11-30 06:00:56 【问题描述】:

我分 3 班工作,每周轮班不同。顺序是早班(m),一晚(n)和下午一(a)。我固定的顺序,即它永远不会改变,即使那一周不会工作。

我创建了一个函数来获取 ISO 周数。当我给它一个日期时,它会返回周数。

例如,本周(第 48 期)我早上工作,因此48 % 3 = 0 → m = 0; n = 1; a = 2。 我将它保存到数组shifts = ["m", "n", "a"]

这是最简单的部分。但是随着年底的到来,我需要解决一个问题。由于 52(2017 年的总周数)不能被 3 整除,并且不同年份有不同的周数,因此模 0(2017 年表示 m)在不同年份表示其他值。

因此,实际的问题是什么是最快和最简单的算法(而不是最简单的算法),不需要人类可读,并解释(如有必要)它为什么/如何做它的工作。

我想到了一个(既不快也不简单):到已知周数。 & shift 类型组合将该周之后的周数相加到年底,并重新计算数组班次。

【问题讨论】:

【参考方案1】:

为什么要使用 ISO 周数? 假设您的一周从某个特定的日子开始(周一、周日,由您决定)。您决定开始日期d0,也是一周开始,轮班0。那么对于任何日期d,您的轮班时间是:

shift = floor(nbdays(d - d0) / 7) mod 3

如果您的系统在一周的开始日期不同的不同地区工作,则可能会出现问题。在这种情况下,您应该为每个区域设置一个特定的d0。如果您的 shift 在全球范围内都相同,则没有问题。

【讨论】:

(1) 我想到了 ISO 周数,因为我住在使用它们的国家。确实我不需要它们,但我从来没有那样想过。 :) ... (2) 仅供我个人使用,因此不同语言环境不会有任何问题。 :) ... (3) nbdays 是什么? @tukusejssirs 重新阅读我自己的问题可能看起来是被动攻击性的。那不是本意。我想知道您是否对周数有特定要求,这会使我的算法无效。显然不是:) 我没有受到任何冒犯,所以不要担心。 :) ...我想我会将其更改为您的答案的解决方案。 …我只是让你告诉我那是什么nbdays。谢谢。 nbdays 正在计算两个日期之间的天数。在 c# 中你会写:d.Substract(d0).TotalDays

以上是关于算法:根据周数获取明年日期工作班次类型的主要内容,如果未能解决你的问题,请参考以下文章

如果根据当前日期获取当前周日期和当前周日期

python中根据时间获取周数,通过周数获取时间

Elixir/Phoenix 日期从工作日 + 周数

从字符串日期获取包含月份名称的周数

Luxon js从工作日数中获取日期

如何根据用户 ID 在 Excel 中自动填充 FIRST 日期