我正在做一个日历页面来显示轮班工作的白天,夜晚和休息日。
时间表如下:7天休息,4晚,3天休息,1天休息,3晚,3天休息,4天,然后28天周期重新开始。周期总是从周五开始。
有4个不同的工作人员:每个人一周后开始。
所以我有一个sql表,只有第一个工作人员的7个关闭的第一个28天周期的月,日和年,我把它吸入一个集合并添加字段来计算其他人员的开始7关。
日历有不同的颜色,可以显示您的休息日,夜晚,日期。所以我浏览列表并使用循环的第一天作为数组的索引:
static int[] DaysArray = new int[28] {0,0,0,0,0,0,0,2,2,2,2,0,0,0,1,1,1,0,2,2,2,0,0,0,1,1,1,1}; // 0 - day off, 1 - days, 2 - nights
所有我感兴趣的是确定在28天周期的哪个时间点开始月份,我只是在其余的日子里用适当的颜色着色。这是我正在努力的例行公事:
protected int GetDayNightOff(int day)
{
day--;
day -= 28;
day = Math.Abs(day);
day--;
return DaysArray[day];
}
如果周期的第一天落在第一天,那么我想用索引0显示起始颜色;第二名:指数27;第3名:索引26等。我知道有一个简单的解决方案,但我似乎无法理解它。
希望有人能提供帮助,我们将不胜感激。
答案 0 :(得分:3)
我建议您使用DateTime
和enum
代替魔术int
。代码将更容易阅读,并且由于日期实际上是pretty hard to get right,因此最好使用库而不是自己执行。然后,您可以从周期开始日减去目标日期,并获得TimeSpan
的{{3}}属性。
static Working[] DaysArray = { Working.Off, Working.Off, Working.Off, Working.Off, Working.Off, Working.Off, Working.Off, Working.Nights, Working.Nights, Working.Nights, Working.Nights, Working.Off, Working.Off, Working.Off, Working.Days, Working.Days, Working.Days, Working.Off, Working.Nights, Working.Nights, Working.Nights, Working.Off, Working.Off, Working.Off, Working.Days, Working.Days, Working.Days, Working.Days };
public enum Working
{
Off,
Days,
Nights,
}
public Working GetDayNightOff(DateTime cycleStart, DateTime day)
{
var days = (day - cycleStart).Days;
days %= DaysArray.Length;
if (days < 0)
days += DaysArray.Length;
return DaysArray[days];
}
days
上的计算允许day
远离cycleStart
。