好的我正在用C#表格编写一个程序,以便能够查看当前日期并确定当前的班次。如果每天的班次相同,这将很容易,但该公司使用2对3关3关3型旋转。所以转变就像下面的
第1天,轮班A,B 第2天,转移A,B 第3天,轮班C,D
等等。我必须能够检测时间(我可以做到并且根据日期确定应该使用什么班次。客户希望它翻转并自动化,以便操作员不必触摸系统。
我曾考虑过使用日历,但似乎找不到一个重量轻,只能做触发器的日历,但很容易填充长时间的移位数据。
考虑在班次序列中使用数组和硬编码,但如果系统关闭了一天,我需要能够维持序列。
我不是在寻找程序或源代码来做这件事,主要是想法以及我如何组织数据。也许我只想努力完成一项轻松的任务
提前谢谢。
答案 0 :(得分:0)
考虑在班次序列中使用数组和硬编码,但如果系统关闭了一天,我需要能够维持序列。
如果您每个班次都有一个已知的开始日期,这将有效。如果班次总是最终重复,您可以根据该日期确定轮班周期中的位置:
将班次时间表描述为布尔数组(例如2 on 2 off,3 on 3 off)
var shiftSchedule = new[] { true, true, false, false, true, true, true, false, false, false};
获取该班次的已知开始日期:
var shiftStartDate = DateTime.Today;
对于已知开始日期之后的任何日期,确定已知开始日期与未来日期之间的天数:
var shiftCheckDate = <somefuturedate>;
var diff = (shiftCheckDate - shiftStartDate).Days;
然后,您可以在换班周期中计算天数,将天数差异模拟为换档阵列索引,以确定您在换班周期中的位置:
var shiftIsOn = shiftSchedule[(diff % shiftSchedule.Length)];
例如,如果今天开始轮班轮换(2017年10月13日):
var shiftSchedule = new[] { true, true, false, false, true, true, true, false, false, false};
var shiftStartDate = DateTime.Today;
var shiftCheckDate = DateTime.Today;
for (var i = 0; i < 16; i++)
{
var diff = (shiftCheckDate - shiftStartDate).Days;
var shiftIsOn = shiftSchedule[(diff % shiftSchedule.Length)];
Console.WriteLine($"{shiftCheckDate.ToShortDateString()} - {shiftIsOnToday}");
shiftCheckDate = shiftCheckDate.AddDays(1);
}
返回
10/13/2017 - True
10/14/2017 - True
10/15/2017 - False
10/16/2017 - False
10/17/2017 - True
10/18/2017 - True
10/19/2017 - True
10/20/2017 - False
10/21/2017 - False
10/22/2017 - False
10/23/2017 - True
10/24/2017 - True
10/25/2017 - False
10/26/2017 - False
10/27/2017 - True
10/28/2017 - True
绝对是一个快速而肮脏的解决方案,但希望它有所帮助。知道你不是在寻找代码,但这是展示示例的最简单方法。欢迎来到SO。
答案 1 :(得分:0)
我遇到的问题与你的问题完全相同。我的回答:
我定义了一个计划块。这可以编辑。存储了这个,以及模式的例外列表。在运行时,通过将模式平铺到日历上然后应用异常来重新创建日历。请注意,这意味着如果编辑了平铺,则历史日历将被破坏 - 在我的情况下,这是无关紧要的,因为这纯粹是关于调度。如果您必须保留历史记录,那么在实际发生日期时,请记录它们并使用它。
我没有必要应对滑点的可能性,但这只是一种不同的例外 - 这是一个新的平铺开始日期。