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